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?

¿Fue útil?

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 .

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).

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top