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

有帮助吗?

解决方案

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

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

其他提示

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

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

public boolean moveToTrash​(File file)

将指定文件移至垃圾箱。

参数:

文件 - 文件

返回:

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

可以通过以下方式测试此功能对于底层平台的可用性 Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH).

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

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

参见 fileutil 孵化器项目( Java桌面集成组件项目):

  

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

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

正如John Topley建议的那样,你必须通过本地操作来做到这一点。如果你不想弄脏一些JNI,你可以使用一个名为 Java Native Access的库。 进行原生呼叫。

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平台/ 5.1.0

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

我的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);
    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top