Java是这里的关键。我需要能够删除文件,但用户希望能够从回收站中“取消删除”。据我所知,这是不可能的。其他人知道吗?
9 回答
十年后,在 Java 9 中,终于有了一种将文件移动到垃圾箱的内置方法
java.awt.Desktop.moveToTrash(java.io.File)
:
public boolean moveToTrash(File file)
将指定的文件移动到垃圾箱。
参数:
文件 - 文件
回报:
如果成功将文件移动到垃圾箱,则返回 true。
可以使用Desktop.isSupported(Desktop.Action.MOVE_TO_TRASH)
.
由于各种原因,Windows没有仅对应于回收站的文件夹的概念。
正确的方法是使用 JNI 调用 Windows SHFileOperation
API,在结构中设置FO_DELETE
标志。SHFILEOPSTRUCT
- SHFileOperation 文档
- 使用 SHFileOperation 复制文件的 Java 示例(同一篇文章中的回收站链接不起作用)
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-platform/5.1.0
不要混淆它是Java Native Access 平台而不是 Java Native Access
我在 suns 网站上找到了这个 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的库来执行本机调用。
我的 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);
}
}
在 JNA 平台中,FileUtils
不使用 Win32 API。您应该更喜欢W32FileUtils
哪个支持撤消(从回收站恢复文件)。
编辑:从 JNA 平台 (5.7.0) 的当前版本开始,使用 FileUtils.getInstance(),此语句已变得不正确,并且 FileUtils 将使用 Win32 API。