使用Java删除到回收站是否可行?

37

Java在这里是关键。我需要能够删除文件,但用户希望能够从回收站“还原”。就我所知,这似乎不可能。有人知道吗?

6个回答

31
十年后,Java 9 终于提供了一种内置的方法来将文件移动到回收站。使用java.awt.Desktop.moveToTrash(java.io.File)方法可以实现。

public boolean moveToTrash​(File file)

将指定的文件移动到回收站。

参数:

file - 文件

返回值:

如果成功将文件移动到回收站,则返回 true。

可通过 Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH) 测试底层平台是否支持此功能。

26

1
这个功能非常好用!你也可以将其移动到Mac OS X的垃圾桶中。 - Paul Lammertsma
1
如果您的程序在使用特殊字符(éèàñ...)的计算机路径上运行,则无法使用iso-8859-1编码,但在英语计算机上可以正常工作。 - Setsuki
@PaulLammertsma 哪一个适用于 Mac OS X,是 John 的答案还是 drye 的? - Igor
据我所知,第二个链接(“发送到回收站”)在Windows和OS X上都可以工作,因为它只是使用标志FOF_ALLOWUNDO执行删除文件的默认操作。 - Paul Lammertsma
2
任何使用 SHFileOperation 的内容都无法在 OS X 上运行,因为 SHFileOperation 是 Windows 的 API。 - John Topley
@JohnTopley 那么它不能在Mac OS X上运行吗?如果是这样,你知道其他在Mac上也能工作的方法吗? - Igor

4

我需要使用Java 8,但是Java 9有新的方法。我发现了Java Native Access Platform,它有hasTrash()moveToTrash()方法。我在Win 10和Mac OS上进行了测试(对我来说有效)。

static boolean moveToTrash(String filePath) {
        File file = new File(filePath);

        FileUtils fileUtils =  FileUtils.getInstance();
        if (fileUtils.hasTrash()) {

            try {
                fileUtils.moveToTrash(new File[] { file });
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            System.out.println("No Trash");
            return false;
        }
    }

Maven仓库 https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform/5.1.0

不要混淆,这是Java Native Access Platform而不是Java Native Access


2
请参见 fileutil 孵化项目(Java Desktop Integration Components 项目的一部分):
此孵化项目旨在托管那些文件实用功能,其中大多数是针对 J2SE 中 java.io.File 类的扩展。Java 开发人员经常要求这样的功能,例如:将文件发送到垃圾箱、检查可用磁盘空间、访问文件属性等。该项目解决了这些经常请求的 API。
请注意,这不仅适用于 Windows,还适用于其他平台(Linux、Mac OS X)。

2
两个链接都无效。这里是一个例子:https://dev59.com/kFDTa4cB1Zd3GeqPJXZB - TAAPSogeking

0

我的建议是使用cmd工具Recycle.exe,并加上-f参数来强制回收(无需提示)。完美运行。

public class Trash {

    public void moveToTrash(File ... file) throws IOException {
        moveToTrash(false, file);
    }

    public void promptMoveToTrash(File ... file) throws IOException {
        moveToTrash(true, file);
    }

    private void moveToTrash(boolean withPrompt, File ... file) throws IOException {
        String fileList = Stream.of(file).map(File::getAbsolutePath).reduce((f1, f2)->f1+" "+f2).orElse("");
        Runtime.getRuntime().exec("Recycle.exe "+(withPrompt ? "" : "-f ")+fileList);
    }

}

0
在JNA平台中,FileUtils不使用Win32 API。您应该选择支持撤消(从回收站还原文件)的W32FileUtils编辑:截至当前JNA平台(5.7.0)的版本,通过FileUtils.getInstance(),此语句已经不正确,并且FileUtils将使用Win32 API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接