trabajar - ¿Es posible eliminar Java en la Papelera de reciclaje?
java 8 (7)
Como sugiere John Topley, debes hacer esto con una operación nativa. En caso de que no quiera ensuciarse las manos con algunos JNI, podría usar una biblioteca llamada Java Native Access para hacer las llamadas nativas.
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?
Encontré este RFE en el sitio de suns: 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.
Consulte el proyecto fileutil incubator (parte del proyecto Componentes de integración de Java Desktop ):
Este proyecto de incubadora está creado para alojar esas funcionalidades de utilidad de archivos, la mayoría de las cuales son extensiones de la clase java.io.File en J2SE. Hay solicitudes frecuentes de desarrolladores de Java para características tales como: enviar un archivo al contenedor de basura , verificar el espacio libre en el disco, acceder a los atributos del archivo, etc. Este proyecto se ocupa de las API solicitadas con frecuencia.
Tenga en cuenta que esto debería funcionar no solo en Windows, sino también en otras plataformas (Linux, Mac OS X).
Aquí está el enlace correcto al ejemplo para usar SHFileOperation para enviar un archivo a la papelera de reciclaje .
Por varias razones, Windows no tiene el concepto de una carpeta que simplemente corresponde a la Papelera de reciclaje .
La forma correcta es usar JNI para invocar la API de Windows SHFileOperation
, estableciendo el indicador FO_DELETE
en la estructura SHFILEOPSTRUCT
.
- Documention de SHFileOperation
- Ejemplo de Java para copiar un archivo usando SHFileOperation (el enlace de la Papelera de Reciclaje en el mismo artículo no funciona)
Mis 3 centavos: use cmd use Recycle.exe con -f para forzar el reciclaje (sin avisos). 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);
}
}
Diez años más tarde, con Java 9, finalmente hay una forma integrada de mover archivos a la Papelera
java.awt.Desktop.moveToTrash(java.io.File)
:
public boolean moveToTrash(File file)
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 característica para la plataforma subyacente se puede probar con Desktop.isSupported(Desktop.Action.MOVE_TO_TRASH)
.