質問
ジャワ がここでの鍵です。ファイルを削除できる必要がありますが、ユーザーはごみ箱から「削除を取り消す」ことができることを期待しています。私の知る限り、これは不可能です。それ以外のことを知っている人はいますか?
解決
さまざまな理由により Windows 単にごみ箱に相当するフォルダーという概念はありません.
正しい方法は、JNI を使用して Windows を呼び出すことです。 SHFileOperation
API、設定 FO_DELETE
のフラグ SHFILEOPSTRUCT
構造。
- SHFileOperation ドキュメント
- SHFileOperation を使用してファイルをコピーする Java の例 (同じ記事内のごみ箱リンクは機能しません)
他のヒント
10 年後、Java 9 では、ついにファイルをゴミ箱に移動する方法が組み込まれました。
java.awt.Desktop.moveToTrash(java.io.File)
:
public boolean moveToTrash(File file)
指定したファイルをゴミ箱に移動します。
パラメーター:
ファイル - ファイル
戻り値:
ファイルがゴミ箱に正常に移動された場合は true を返します。
基盤となるプラットフォームでこの機能が利用できるかどうかは、次のようにテストできます。 Desktop.isSupported(Desktop.Action.MOVE_TO_TRASH)
.
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というライブラリを使用できます。 でネイティブコールを実行します。
Java 9には新しいメソッドがありますが、私の場合はJava 8に制限されています。 hasTrash()および moveToTrash()メソッドを持つ Java Native Access Platform を見つけました。 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ではありません
私の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);
}
}