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