72 Stimmen

Wie überprüft man in Java, ob ein Verzeichnis leer ist

Ich möchte überprüfen, ob ein Verzeichnis in Java leer ist. Es besteht jedoch die Möglichkeit, dass sich viele Dateien in diesem Verzeichnis befinden, daher möchte ich es, wenn möglich, ohne Abfrage seiner Dateiliste tun.

4voto

gd1 Punkte 11058

Dies ist ein schmutziger Workaround, aber Sie können versuchen, ihn zu löschen (mit der delete-Methode) und wenn der Löschvorgang fehlschlägt, dann ist das Verzeichnis nicht leer, wenn er erfolgreich ist, dann ist es leer (aber Sie müssen es neu erstellen, und das ist nicht ordentlich). Ich werde weiter nach einer besseren Lösung suchen.

BEARBEITEN: Ich habe walkFileTree aus der Java.nio.file.Files-Klasse gefunden: [http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path](http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path), java.nio.file.FileVisitor) Das Problem ist, dass dies nur in Java 7 funktioniert.

Ich habe auf S.O. nach anderen Fragen zu diesem speziellen Problem gesucht (Dateien in einem Verzeichnis auflisten, ohne list() zu verwenden, was Speicher für ein großes Array reserviert) und die Antwort ist fast immer "Sie können es nicht, es sei denn, Sie verwenden JNI", was sowohl plattformabhängig als auch hässlich ist.

3voto

RonK Punkte 9156

Wenn Sie mit plattformabhängigem Code leben können, können Sie versuchen, tatsächlichen nativen Code zu verwenden, indem Sie eine Systembibliothek laden und ihre APIs nutzen.

Im Windows haben Sie zum Beispiel eine Win32 API namens FindFirstFile() mit dem Verzeichnisnamen (ohne einem abschließenden Schrägstrich). Wenn es etwas anderes als . und .. zurückgibt, wissen Sie, dass das Verzeichnis nicht leer ist. Es listet nicht alle Dateien auf, sodass es viel schneller ist als file.list().

Das Äquivalent auf Unix ist opendir. Für Ihre Zwecke wäre die Logik die gleiche.

Natürlich hat das Aufrufen von nativen Methoden einen Preis in Bezug auf die Benutzerfreundlichkeit und das anfängliche Laden der Bibliothek, was jedoch durch die Zeit aufgehoben werden sollte, die bei den Dateisystemabfragen eingespart wird.

2voto

lesolorzanov Punkte 3335
     Path checkIfEmpty=Paths.get("Pathtofile");
     DirectoryStream ds = Files.newDirectoryStream(checkIfEmpty);
     Iterator files = ds.iterator();
     if(!files.hasNext())
         Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));

-1voto

Radhesh Khanna Punkte 141

Ich hatte auch lange Zeit diese Verwirrung darüber, wie man überprüft, ob das Verzeichnis leer ist oder nicht. Aber die Antwort ist ganz einfach, verwenden Sie

class isFileEmpty{
public static void main(String args[]){
File d = new File(//Pfad des zu überprüfenden oder zu öffnenden Verzeichnisses);
String path = d.getAbsolutePath().toString();
File dir = new File(path);
File[] files = dir.listFiles();
if(!dir.exists()){
System.out.Println("Verzeichnis ist leer");
}
else{
for(int i =0;i

-1voto

Eugene Shamkin Punkte 153

Ich möchte die Antwort des Entwicklers hinzufügen. Überprüfen, ob es sich um ein Verzeichnis handelt oder nicht, sollte nicht in einem If-Operator liegen, da Sie einen Fehler in der Logik haben werden. Zuerst überprüfen Sie, ob es sich um ein Verzeichnis handelt oder nicht, und erst danach überprüfen Sie die Verzeichniskonsistenz, da Sie eine falsche Antwort erhalten, wenn die übergebene Methode das Verzeichnis nicht vorhanden ist. Überprüfe es einfach. Sollte so aussehen:

 if (file.isDirectory()) {
    if( file.list().length == 0) {
        logger.info("Verzeichnis ist leer");
        return false;
    } else {
        logger.info("Verzeichnis ist nicht leer");
        return true;
    }
} else {
    return false;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X