2017-03-04 1 views
0

Ich verwende file.listFile(), um die Dateien und Verzeichnisse in einem angegebenen Pfad aufzulisten. Der Grund, warum ich file.ListFile() verwende, ist, weil ich einen FileFilter benutze, wenn der Benutzer nur Verzeichnisse oder nur Dateien zurückgeben möchte. Aber das Ergebnis ist, dass es nur die Ordner und Dateien im angegebenen Pfad auflistet und keine Unterordner und Dateien. Dies ist, was ich bin mit jetzt:Wie kann ich file.listFiles() verwenden, um Unterverzeichnisse und Dateien auch aufzulisten

file = new File(directory.getText().trim()); 

// Used this for testing; ListFiles() is a method 
File[] test = ListFiles(directory.getName()); // I made up that will list the subfolders and files. 
results.setListData(test); // Also for testing. results is a JList 

// This is what i previously had that only lists folders and file in that directory 
results.setListData(file.listFiles(new Filter() { 
    public boolean accept(File file) { 
    if (directories.isSelected()) { 
     // Directories checkBox 
     if (files.isSelected()) { 
     // Files checkBox 
     // FILES && DIRECTORIES 
     return (file.isDirectory() || file.isFile()) && (StringUtils.contains(file.getName(), userInput.getText().trim())); 
     } 
     // DIRECTORIES 
     return (file.isDirectory()) && (StringUtils.contains(file.getName(), userInput.getText().trim())); 
     } else { 
     if (files.isSelected()) { 
      // FILES 
      return (file.isFile()) && (StringUtils.contains(file.getName(), userInput.getText().trim())); 
     } 
     } 
     return true; 
    } 
    })); 
} 

Ich bin nur nicht sicher, wie mit den Filtern gehen über beteiligt

Antwort

0

Die Dokumentation für File#listFiles() geht nicht hervor, dass es alle Unterverzeichnisse geht. Also musst du das selbst tun. Für jedes Verzeichnis, das von listFiles() zurückgegeben wird, müssen Sie den Aufruf listFiles() rekursiv aufrufen.

Sie können dies in dem Filter tun, solange Sie alle Ihre Dateien in einer anderen Struktur sammeln, da Sie nicht mehr Dateien zum Ergebnis hinzufügen können, indem Sie den Filter allein verwenden. Und ich würde dir nicht empfehlen, das zu tun.

Sie könnten die Filter besser dran zu verzichten und so etwas wie dies zu tun:

List<File> files = new ArrayList<>(); 

public void getFiles(File file) { 
    for (File file : file.listFiles()) { 
     if (file.isDirectory()) { 
      if (collectDirectories) { 
       files.add(file); 
      } 
      getFiles(file); 
     } else { 
      if (collectFiles) { 
       files.add(file); 
      } 
     } 
    } 
} 
+0

Wäre es nicht die Filter Inline leichter haben, ist es eine externe Funktion machen und rufen 'Listfiles()' mit dem Filefilter Funktion als Parameter? – Vince

+0

Das hilft Ihnen nicht, alle Unterverzeichnisse zu gehen. Siehe meine Bearbeitung. – Jeremy

+0

Das einzige Problem, das ich benutze eine Liste ist, dass, wenn ich 'results.setListData()' es erfordert eine 'File []' keine Liste. – Vince

Verwandte Themen