Comment vérifier si un répertoire est vide en Java

Je voudrais vérifier si le répertoire est vide en Java. Mais il y a une possibilité qu'il y ait beaucoup de fichiers dans ce répertoire, donc j'aimerais le faire sans interroger sa liste de fichiers, si possible.

46
demandé sur skaffman 2011-05-09 00:19:34

8 réponses

Avec JDK7, vous pouvez utiliser des fichiers.newDirectoryStream pour ouvrir le répertoire, puis utiliser la méthode hasNext() de l'itérateur pour tester qu'il y a des fichiers à parcourir (n'oubliez pas de fermer le flux). Cela devrait mieux fonctionner pour les répertoires énormes ou où le répertoire est sur un système de fichiers distant par rapport aux méthodes java.Io.File list.

Exemple:

private static boolean isDirEmpty(final Path directory) throws IOException {
    try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {
        return !dirStream.iterator().hasNext();
    }
}
61
répondu Alan 2014-08-14 15:31:09
File parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
    LOGGER.info("Directory is empty");
} else {
    LOGGER.info("Directory is not empty");
}
14
répondu Developer 2016-02-12 06:05:13

Compte tenu de la java.io.File le code source, list() la méthode n':

    public java.lang.String[] list() {
    ...
        byte[][] implList = listImpl(bs);
        if (implList == null) {
           // empty list
           return new String[0];
        }     
     ...
     }

     private synchronized static native byte[][] listImpl(byte[] path);

Il appelle une méthode native en passant un tableau d'octets pour en extraire des fichiers. Si une méthode retourne null, cela signifie que le répertoire est vide.

Ce qui signifie , Ils n'ont même pas de méthode native, pour vérifier le vide du répertoire sans lister les fichiers, donc il n'y a aucun moyen qu'ils aient une implémentation en java pour vérifier si le répertoire est vide.

Résultat: vérifier si le répertoire est vide sans lister les fichiers n'est pas encore implémenté en java.

8
répondu JMelnik 2016-05-12 10:48:19

C'est un sale solution de contournement, mais vous pouvez essayer de faire supprimer (avec le delete méthode), et si l'opération de suppression échoue, alors le répertoire n'est pas vide, si elle réussit, alors qu'il est vide (mais vous devez le recréer, et ce n'est pas joli). Je vais continuer à chercher une meilleure solution.

EDIT : j'ai trouvé walkFileTree de java.nio.fichier.Classe de fichiers: http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path, Java.nio.fichier.FileVisitor) Le problème est que C'est Java 7 seulement.

J'ai cherché S. O. pour d'autres questions liées à ce problème (lister des fichiers dans un répertoire sans utiliser list () qui alloue de la mémoire pour un grand tableau) et la réponse est toujours "vous ne pouvez pas, sauf si vous utilisez JNI", qui dépend à la fois de la plate-forme et laid.

4
répondu gd1 2011-05-08 21:50:24

Si vous pouvez vivre avec du code dépendant de la plate-forme-vous pouvez essayer d'utiliser du code natif réel en chargeant une bibliothèque système et en utilisant ses API.

Dans Windows par exemple, vous avez une API Win32 nommée FindFirstFile() avec le nom du répertoire (sans une barre oblique inverse de fin). S'il renvoie autre chose que . et .., vous savez que le répertoire n'est pas vide. Il ne listera pas tous les fichiers, donc c'est beaucoup plus rapide que file.list().

L'équivalent sous Unix est opendir. Pour votre fins de la logique serait le même.

Bien sûr, l'appel de méthodes natives a un prix sur la facilité d'utilisation et le chargement initial de la bibliothèque qui devrait être annulé au moment où il économisera sur les requêtes FS.

3
répondu RonK 2011-05-08 21:14:53
if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }

Comme Fichiers.list retourne un flux paresseusement peuplé, il résoudra votre problème lié au temps d'exécution.

3
répondu Minnow 2016-12-01 10:41:15
     Path checkIfEmpty=Paths.get("Pathtofile");
     DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
     Iterator files = ds.iterator();
     if(!files.hasNext())
         Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));
2
répondu Zloy Smiertniy 2012-08-06 19:19:27

J'ai aussi eu cette Confusion pendant longtemps sur la façon de vérifier si le répertoire était vide ou non Mais la réponse est assez Simple utiliser

class isFileEmpty{
public static void main(String args[]){
File d = new File(//Path of the Directory you want to check or open);
String path = d.getAbsolutePath().toString();
File dir = new File(path);
File[] files = dir.listFiles();
if(!dir.exists()){
System.out.Println("Directory is Empty");
}
else{
for(int i =0;i<files.length;i++){
System.out.Println(files[i])
           }
       }
   }
}
-1
répondu Radhesh Khanna 2017-06-30 08:19:19