Frage

Java ist hier der Schlüssel. Ich muß in der Lage sein, Dateien zu löschen, aber die Benutzer erwarten, aus dem Papierkorb zu „Undelete“ zu können. Soweit ich sagen kann, ist dies nicht möglich. Wer weiß sonst?

War es hilfreich?

Lösung

Aus verschiedenen Gründen Windows- hat kein Konzept für einen Ordner, der einfach entspricht den Papierkorb .

Der richtige Weg ist JNI zu verwenden, um die Windows-SHFileOperation API aufrufen, die FO_DELETE Flag in der SHFILEOPSTRUCT Struktur zu setzen.

Andere Tipps

Zehn Jahre später mit Java 9, schließlich gibt es eine eingebaute Möglichkeit, Dateien in den Papierkorb zu verschieben Ist

java.awt.Desktop.moveToTrash(java.io.File) :
  

public boolean moveToTrash​(File file)

     

Verschiebt die angegebene Datei in den Papierkorb.

     

Parameter:

     

Datei - Die Datei

     

Returns:

     

liefert true, wenn die Datei erfolgreich in den Papierkorb verschoben.

Die Verfügbarkeit dieser Funktion für die zugrunde liegende Plattform kann mit Desktop.isSupported​(Desktop.Action.MOVE_TO_TRASH) getestet werden.

Ich habe diese RFE auf Sonnen-Website gefunden: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625

Das sagt mir, es ist nicht eine native Java-Weg, dies zu tun. und als @John Topley nur die einzige Lösung geschrieben ist ein JNI Aufruf.

Sehen Sie das FileUtil Inkubator-Projekt (Teil des Java Desktop-Integrationskomponenten Projekt):

  

Das Inkubator-Projekt wird erstellt, diese Datei Dienstprogramm Funktionalitäten zu hosten, von denen die meisten Erweiterungen der Klasse java.io.File in J2SE sind. Es gibt häufige Anfragen von Java-Entwickler für solche Funktionen wie:. Senden einer Datei bin in den Papierkorb , freien Speicherplatz überprüft, Datei Zugriff auf Attribute usw. Dieses Projekt richtet sich so häufig APIs angefordert

Beachten Sie, sollte diese Arbeit nicht nur auf Windows, sondern auf anderen Plattformen (Linux, Mac OS X) als auch.

Wie John Topley schon sagt, Sie müssen dies tun, mit einem nativen Betrieb. Falls Sie nicht möchten, dass Ihre Hände schmutzig mit einigen JNI erhalten, können Sie eine Bibliothek verwenden könnte Java Native Access genannt die nativen Anrufe zu tun.

Java 9 hat eine neue Methode, aber in meinem Fall habe ich beschränkt bin auf Java 8. Ich fand Java Native Access Platform , das hat hasTrash () und moveToTrash () Methode. Getestet habe ich es auf Win 10 und Mac OS (Arbeitet) für mich.

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 Repository https://mvnrepository.com/artifact/net. java.dev.jna / jna-Plattform / 5.1.0

Nicht zu verwechseln ist Java Native Access Platform nicht Java Native Access

Meine 3 Cent - Verwendung cmd util Recycle.exe mit -f erzwingen Recycling (kein Prompt). Funktioniert perfekt.

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);
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top