35

Java是这里的关键。我需要能够删除文件,但用户希望能够从回收站中“取消删除”。据我所知,这是不可能的。其他人知道吗?

4

9 回答 9

28

十年后,在 Java 9 中,终于有了一种将文件移动到垃圾箱的内置方法

java.awt.Desktop.moveToTrash(java.io.File)

public boolean moveToTrash​(File file)

将指定的文件移动到垃圾箱。

参数:

文件 - 文件

回报:

如果成功将文件移动到垃圾箱,则返回 true。

可以使用Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH).

于 2018-01-16T14:56:50.667 回答
26

由于各种原因,Windows没有仅对应于回收站的文件夹的概念

正确的方法是使用 JNI 调用 Windows SHFileOperationAPI,在结构中设置FO_DELETE标志。SHFILEOPSTRUCT

于 2008-10-21T16:33:40.827 回答
4

Java 9 有新方法,但就我而言,我仅限于 Java 8。我发现Java Native Access Platform具有hasTrash()moveToTrash()方法。我为我在 Win 10 和 Mac OS (Worked) 上测试了它。

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 平台而不是 Java Native Access

于 2018-11-20T07:50:53.277 回答
2

我在 suns 网站上找到了这个 RFE: http ://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625

这告诉我没有本地 Java 方法可以做到这一点。正如@John Topley 刚刚发布的那样,唯一的解决方案是 JNI 调用。

于 2008-10-21T16:38:27.167 回答
2

请参阅fileutil孵化器项目(Java 桌面集成组件项目的一部分):

创建这个孵化器项目是为了托管这些文件实用程序功能,其中大部分是对 J2SE 中 java.io.File 类的扩展。Java 开发人员经常要求此类功能,例如:将文件发送到垃圾箱、检查可用磁盘空间、访问文件属性等。这个项目解决了这些经常请求的 API。

请注意,这不仅适用于 Windows,还适用于其他平台(Linux、Mac OS X)。

于 2009-09-30T12:20:50.823 回答
2

这是使用 SHFileOperation 将文件发送到回收站的示例的正确链接。

于 2009-11-26T00:53:17.047 回答
1

正如 John Topley 所建议的,您必须使用本机操作来执行此操作。如果您不想弄脏一些 JNI,您可以使用一个名为Java Native Access的库来执行本机调用。

于 2008-10-21T17:58:06.540 回答
0

我的 3 美分 - 使用 cmd util 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);
    }

}
于 2017-06-24T14:18:26.253 回答
0

在 JNA 平台中,FileUtils不使用 Win32 API。您应该更喜欢W32FileUtils哪个支持撤消(从回收站恢复文件)。

编辑:从 JNA 平台 (5.7.0) 的当前版本开始,使用 FileUtils.getInstance(),此语句已变得不正确,并且 FileUtils 将使用 Win32 API。

于 2019-07-24T09:23:32.103 回答