Java是否可以删除到回收站?

Java是否可以删除到回收站?,java,recycle-bin,Java,Recycle Bin,Java是这里的关键。我需要能够删除文件,但用户希望能够从回收站“取消删除”。据我所知,这是不可能的。有人不知道吗?出于各种原因 正确的方法是使用JNI调用WindowsSHFileOperationAPI,在SHFILEOPSTRUCT结构中设置fou DELETE标志 (同一篇文章中的回收站链接不起作用) 我在suns网站上找到了这个RFE: 这告诉我,没有一种本地java方法可以做到这一点。正如@John Topley刚刚发布的,唯一的解决方案是一个JNI调用。正如John Topl

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

出于各种原因

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

  • (同一篇文章中的回收站链接不起作用)

我在suns网站上找到了这个RFE:


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

正如John Topley所建议的,您必须使用本机操作来实现这一点。如果您不想让一些JNI弄脏您的手,您可以使用一个名为的库来执行本机调用。

请参阅孵化器项目(项目的一部分):

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


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

以下是指向的正确链接。

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

}

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

:
public boolean moveToTrash​(文件)
将指定的文件移动到垃圾箱

参数: 文件-文件

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


可使用
Desktop.isSupported测试此功能在基础平台上的可用性​(Desktop.Action.MOVE_TO_TRASH)

Java9有了新的方法,但就我而言,我只限于Java8。 我发现Java原生访问平台具有hasTrash()moveToTrash()方法。我在Win10上测试了它,Mac操作系统(对我有效)

Maven存储库


不要混淆它是Java本机访问平台而不是Java本机访问

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


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

这就像一个符咒!您也可以移动到Mac OS X垃圾桶。如果您的程序在路径中使用特殊字符(èèñ…)的计算机上使用,则它不适用于iso-8859-1编码。。。但是在英语课上很好computer@PaulLammertsma哪一个适用于MacOSX,John的答案还是Drey的?IIRC,第二个链接(“发送到回收站”)可以在Windows和OS X上运行,因为它只是执行默认操作来删除带有标志
FOF_ALLOWUNDO
的文件。任何使用
SHFileOperation
的操作都不能在OS X上运行,因为
SHFileOperation
是Windows的API。这两个链接都不起作用。这就是一个例子
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;
        }
    }