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

时间:2008-10-21 16:14:03

标签: java recycle-bin

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

9 个答案:

答案 0 :(得分:25)

由于各种原因Windows has no concept of a folder that simply corresponds to the Recycle Bin

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

答案 1 :(得分:11)

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

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

public boolean moveToTrash​(File file)

     

将指定文件移至废纸篓。

     

参数:

     

文件 - 文件

     

返回:

     如果成功将文件移动到废纸篓,则

返回true。

可以使用Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH)测试底层平台的此功能的可用性。

答案 2 :(得分:2)

我在太阳网站上发现了这个RFE: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625

这告诉我没有一种原生的java方法来做到这一点。正如@John Topley刚发布的那样,唯一的解决方案是JNI电话。

答案 3 :(得分:2)

参见fileutil孵化器项目(Java Desktop Integration Components项目的一部分):

  

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

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

答案 4 :(得分:2)

答案 5 :(得分:1)

正如John Topley建议的那样,你必须通过本地操作来做到这一点。如果您不想亲自使用某些JNI,可以使用名为Java Native Access的库来执行本机调用。

答案 6 :(得分:1)

Java 9具有新方法,但就我而言,我仅限于Java 8。 我发现 Java本机访问平台具有 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

答案 7 :(得分: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);
    }

}

答案 8 :(得分:0)

在JNA平台中,FileUtils不使用Win32 API。您应该选择支持撤消(从回收站还原文件)的W32FileUtils