【发布时间】:2008-10-21 16:14:02
【问题描述】:
Java 是这里的关键。我需要能够删除文件,但用户希望能够从回收站中“取消删除”。据我所知,这是不可能的。有谁知道吗?
【问题讨论】:
标签: java recycle-bin
Java 是这里的关键。我需要能够删除文件,但用户希望能够从回收站中“取消删除”。据我所知,这是不可能的。有谁知道吗?
【问题讨论】:
标签: java recycle-bin
十年后,Java 9 终于有了一种将文件移动到垃圾箱的内置方法
java.awt.Desktop.moveToTrash(java.io.File):
public boolean moveToTrash(File file)将指定的文件移动到回收站。
参数:
文件 - 文件
返回:
如果成功将文件移动到垃圾箱,则返回 true。
可以使用Desktop.isSupported(Desktop.Action.MOVE_TO_TRASH) 测试此功能对底层平台的可用性。
【讨论】:
由于各种原因 Windows has no concept of a folder that simply corresponds to the Recycle Bin.
正确的方法是使用JNI调用Windows的SHFileOperation API,在SHFILEOPSTRUCT结构中设置FO_DELETE标志。
【讨论】:
FOF_ALLOWUNDO 的文件的默认操作。
SHFileOperation 的东西都不能在OS X 上运行,因为SHFileOperation 是Windows 的API。
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 Platform而不是Java Native Access
【讨论】:
我在 suns 网站上找到了这个 RFE: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5080625
这告诉我没有本地 Java 方法可以做到这一点。正如@John Topley 刚刚发布的那样,唯一的解决方案是 JNI 调用。
【讨论】:
参见fileutil 孵化器项目(Java Desktop Integration Components 项目的一部分):
创建这个孵化器项目是为了托管这些文件实用程序功能,其中大部分是对 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。
【讨论】: