Spostare file nel cestino in Java
Facciamo la premesse che l'argomento del titolo varia si usiamo Java 9 o versioni precedenti.
Infatti in Java 9 c'è un metodo apposito che fa parte della classe Desktop: moveToTrash!
Non l'ho ancora testato, ma dovrebbe funzionare su tutte le piattaforme.
Se invece siamo usiamo versioni precedenti alla 9, dobbiamo fare distinzione su quale OS stiamo.
Questo perchè Linux gestisce il cestino in maniera molto diversa da Windows.
Su Linux il cestino dell'utente è nella propria home, e nello specifico in ~/.local/share/Trash/:
$ ls -la ~/.local/share/Trash/
drwx------ 4 matte matte 12288 5 feb 08.44 expunged
drwx------ 2 matte matte 40960 5 feb 09.57 files
drwx------ 2 matte matte 65536 5 feb 09.57 info
Dove:
- files: qui vengono spostati i files
- info: qui vengono creati dei file di info per i file cancellati, come il path di origine, quando sono stati cancellati
- expugned: qui ci dovrebbero essere delle cartelle cancellate dal mio utente, ma che contengono anche files di un altro utente
E penso che per macOS sia lo stesso.
E tutto questo perchè com.sun.jna.platform.FileUtils non supporta nient'altro che Windows.
Quindi, un codice potrebbe essere questo:
try {
File f = new File("file_da_cancellare");
com.sun.jna.platform.FileUtils fu = com.sun.jna.
platform.FileUtils.getInstance();
if (fu.hasTrash()) {
fu.moveToTrash(new File[]{f});
} else {
File trash = new File(
System.getProperty("user.home")
+ "/.local/share/Trash/files");
if (trash.exists()) {
org.apache.commons.io.FileUtils.
moveFileToDirectory(f, trash, false);
} else {
f.delete();
}
}
} catch (IOException e) {
}
In pratica, prima usiamo JNA per controllare se il trash è supportato.
Se la risposta è negativa, controlliamo l'esistenza del trash e spostiamo il file usando Apache Commons IO (ma questo non è obbligatorio).
Se neanche questa directory esiste, non ci rimane che cancellare il file senza passare dal cestino.
Quindi nel nostro Maven avremo:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>4.1.0</version>
</dependency>
In sostanza le due classi FileUtils fanno parte di due librerie diverse (ecco perchè ho specificato il nome completo).
Enjoy!
java apache commons io fileutils jna movetotrash trash maven
Commentami!