¿Es posible con Java eliminar a la Papelera de reciclaje?
-
03-07-2019 - |
Pregunta
Java es la clave aquí. Necesito poder eliminar archivos, pero los usuarios esperan poder "recuperar". de la papelera de reciclaje. Por lo que puedo decir, esto no es posible. Alguien sabe lo contrario?
Solución
Por varias razones, Windows no tiene un concepto de carpeta que simplemente corresponde a la Papelera de reciclaje .
La forma correcta es usar JNI para invocar la API SHFileOperation
de Windows, configurando el indicador FO_DELETE
en la estructura SHFILEOPSTRUCT
.
- Documentación de SHFileOperation
- Ejemplo de Java para copiar un archivo usando SHFileOperation (el enlace Papelera de reciclaje en el mismo el artículo no funciona)
Otros consejos
Diez años después, con Java & nbsp; 9, finalmente hay una forma integrada de mover archivos a la Papelera
java .awt.Desktop.moveToTrash (java.io.File)
:
moveToTrash público booleano (archivo)
Mueve el archivo especificado a la papelera.
Parámetros:
archivo - el archivo
Devoluciones:
devuelve verdadero si movió con éxito el archivo a la papelera.
La disponibilidad de esta función para la plataforma subyacente se puede probar con Desktop.isSupported (Desktop.Action.MOVE_TO_TRASH)
.
He encontrado este RFE en el sitio de soles: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625
Esto me dice que no hay una forma nativa de Java para hacer esto. y como @John Topley acaba de publicar, la única solución es una llamada JNI.
Vea el fileutil proyecto incubadora (parte del Componentes de Java Desktop Integration ):
Este proyecto de incubadora se creó para alojar esas funcionalidades de utilidad de archivo, la mayoría de las cuales son extensiones de la clase java.io.File en J2SE. Los desarrolladores de Java solicitan con frecuencia funciones como: enviar un archivo a la papelera de reciclaje , verificar el espacio libre en el disco, acceder a los atributos del archivo, etc. Este proyecto aborda las API que se solicitan con frecuencia.
Nota, esto debería funcionar no solo en Windows, sino también en otras plataformas (Linux, Mac OS X).
Aquí está el enlace correcto a el ejemplo para usar SHFileOperation para enviar un archivo a la papelera de reciclaje .
Como sugiere John Topley, debe hacer esto con una operación nativa. En caso de que no quiera ensuciarse las manos con algo de JNI, puede usar una biblioteca llamada Java Native Access para hacer las llamadas nativas.
Java 9 tiene un nuevo método, pero en mi caso estoy restringido a Java 8. Encontré Java Native Access Platform que tiene el método hasTrash () y moveToTrash () . Lo probé en Win 10 y Mac OS (Funcionado) para mí.
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;
}
}
Repositorio Maven https://mvnrepository.com/artifact/net. java.dev.jna / jna-platform / 5.1.0
No confunda Es Java Native Access Platform no Java Native Access
Mis 3 centavos: use cmd util Recycle.exe con -f para forzar el reciclaje (no rápido). Funciona perfectamente.
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);
}
}