Question

Java est la clé ici. Je dois pouvoir supprimer des fichiers, mais les utilisateurs s'attendent à pouvoir "annuler la suppression". de la corbeille. Autant que je sache, ce n'est pas possible. Quelqu'un sait autrement?

Était-ce utile?

La solution

Pour diverses raisons, Windows ne dispose d'aucun concept de dossier. correspond à la corbeille .

La méthode correcte consiste à utiliser JNI pour appeler l'API Windows SHFileOperation , en définissant l'indicateur FO_DELETE dans la structure SHFILEOPSTRUCT .

Autres conseils

Dix ans plus tard, avec Java & 9, il existe enfin un moyen intégré de déplacer des fichiers dans la corbeille

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

moveToTrash booléen public (fichier fichier)

     

Déplace le fichier spécifié dans la corbeille.

     

Paramètres:

     

fichier - le fichier

     

renvoie:

     

renvoie true si le fichier a été déplacé avec succès dans la corbeille.

La disponibilité de cette fonctionnalité pour la plate-forme sous-jacente peut être testée avec Desktop.isSupported (Desktop.Action.MOVE_TO_TRASH) .

J'ai trouvé ce RFE sur le site des soleils: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 5080625

Cela me dit qu’il n’ya pas de méthode java native pour le faire. et comme John Topley vient de publier la seule solution est un appel JNI.

Voir le fileutil projet d'incubateur (faisant partie du Projet des composants d'intégration de Java Desktop :

  

Ce projet d'incubateur est créé pour héberger les fonctionnalités de cet utilitaire de fichier, dont la plupart sont des extensions de la classe java.io.File dans J2SE. Les développeurs Java demandent fréquemment des fonctionnalités telles que: envoyer un fichier à la corbeille , vérifier l'espace disque disponible, accéder aux attributs de fichier, etc. Ce projet répond aux API fréquemment demandées.

Notez que cela devrait fonctionner non seulement sous Windows, mais également sur d'autres plates-formes (Linux, Mac OS X).

Comme le suggère John Topley, vous devez le faire avec une opération native. Si vous ne voulez pas vous mettre à la tâche avec un JNI, vous pouvez utiliser une bibliothèque appelée Accès natif Java. faire les appels natifs.

Java 9 a une nouvelle méthode mais dans mon cas, je suis limité à Java 8. J'ai trouvé la plate-forme Java Native Access dotée des méthodes hasTrash () et moveToTrash () . Je l'ai testé sous Windows 10 et Mac OS (Worked) pour moi.

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

Dépôt Maven https://mvnrepository.com/artifact/net. java.dev.jna / jna-platform / 5.1.0

Ne vous trompez pas, il s'agit de plate-forme Java Native Access et non de Java Native Access

.

Mes 3 cents - utilisez cmd util Recycle.exe avec -f pour forcer le recyclage (non rapide). Fonctionne parfaitement.

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top