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.
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();
}
}
File parentDir = file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
LOGGER.info("Directory is empty");
} else {
LOGGER.info("Directory is not empty");
}
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.
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.
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.
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.
Path checkIfEmpty=Paths.get("Pathtofile");
DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
Iterator files = ds.iterator();
if(!files.hasNext())
Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));
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])
}
}
}
}