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