Domanda

Java è la chiave qui. Devo essere in grado di eliminare i file ma gli utenti si aspettano di essere in grado di "ripristinare" " dal cestino. Per quanto ne so, questo non è possibile. Qualcuno sa diversamente?

È stato utile?

Soluzione

Per vari motivi Windows non ha l'idea di una cartella che semplicemente corrisponde al Cestino .

Il modo corretto è utilizzare JNI per richiamare l'API SHFileOperation di Windows, impostando il flag FO_DELETE nella struttura SHFILEOPSTRUCT .

Altri suggerimenti

Dieci anni dopo, con Java & nbsp; 9, finalmente c'è un modo integrato per spostare i file nel cestino

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

moveToTrash pubblico (file file)

     

Sposta il file specificato nel cestino.

     

Parametri:

     

file: il file

     

Returns:

     

restituisce true se il file è stato spostato correttamente nel cestino.

La disponibilità di questa funzione per la piattaforma sottostante può essere testata con Desktop.isSupported (Desktop.Action.MOVE_TO_TRASH) .

Ho trovato questo RFE sul sito suns: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625

Questo mi dice che non esiste un modo Java nativo per farlo. e dato che @John Topley ha appena pubblicato l'unica soluzione è una chiamata JNI.

Vedi il fileutil progetto dell'incubatore (parte del progetto Java Desktop Integration Components ):

  

Questo progetto di incubatore è stato creato per ospitare quelle funzionalità di utilità dei file, la maggior parte delle quali sono estensioni della classe java.io.File in J2SE. Esistono richieste frequenti da parte degli sviluppatori Java per funzionalità come: invio di un file nel cestino , controllo dello spazio libero su disco, accesso agli attributi dei file, ecc. Questo progetto si rivolge a API così frequentemente richieste.

Nota, questo dovrebbe funzionare non solo su Windows, ma anche su altre piattaforme (Linux, Mac OS X).

Come suggerisce John Topley, devi farlo con un'operazione nativa. Nel caso in cui non desideri sporcarti le mani con alcuni JNI, puoi utilizzare una libreria chiamata Java Native Access per effettuare chiamate native.

Java 9 ha un nuovo metodo ma nel mio caso sono limitato a Java 8. Ho trovato Java Native Access Platform che ha il metodo hasTrash () e moveToTrash () . L'ho provato su Win 10 e Mac OS (funzionato) per me.

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-platform / 5.1.0

Non confondere È Java Native Access Platform non Java Native Access

I miei 3 centesimi: utilizzare cmd util Recycle.exe con -f per forzare il riciclo (no richiesta). Funziona perfettamente.

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top