题
爪哇 是这里的关键。我需要能够删除文件,但用户希望能够从回收站“取消删除”。据我所知这是不可能的。还有人知道吗?
解决方案
由于各种原因 Windows 没有文件夹的概念,仅对应于回收站.
正确的方法是使用JNI调用Windows SHFileOperation
API,设置 FO_DELETE
标志在 SHFILEOPSTRUCT
结构。
- SHFile操作文档
- 使用 SHFileOperation 复制文件的 Java 示例 (同一篇文章中的回收站链接不起作用)
其他提示
十年后,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);
}
}