2016-04-02 8 views
1

Ich muss nur. TXT-Dateien aus Ordner und Unterordner lesen und sie in eine Datei zusammenführen. Das Problem ist, wenn ich filter, es iteriert nur im Stammordner. Hier ist Code:Dateien lesen und zusammenführen JavaFX

public void walk(String path) { 
    FilenameFilter textFilter = new FilenameFilter() { 
     public boolean accept(File dir, String name) { 
      return name.toLowerCase().endsWith(".txt"); 
     } 
    }; 
    File root = new File(path); 
    File[] list = root.listFiles(textFilter); 

    if (list == null) return; 

    for (File f : list) { 
     if (f.isDirectory()) { 
      walk(f.getAbsolutePath()); 
      System.out.println("Dir:" + f.getAbsoluteFile()); 

     } 
     else { 
      System.out.println("File:" + f.getAbsoluteFile()    
      ); 
     } 
    } 
} 

und DirectoryChooser Funktion:

DirectoryChooser directoryChooser = new DirectoryChooser(); 
    directoryChooser.setTitle("Open Folder"); 
    File selectedDirectory = 
      directoryChooser.showDialog(null); 
    if(selectedDirectory == null){ 
     pathLabel.setText("No Directory selected"); 
    }else{ 
     pathLabel.setText(selectedDirectory.getAbsolutePath()); 
    } 
    walk(selectedDirectory.getAbsolutePath()); 
} 

Was mache ich falsch?

+2

Ihr Dateifilter schließt Unterverzeichnisse aus. Daher wird Ihre Schleife nur über TXT-Dateien iteriert und geht nie in Subdirects. – lwi

Antwort

2

Sie filtern vor dem Schleifen und Ihr Filter schließt alles außer txt-Dateien aus. Das bedeutet, list enthält keine Unterverzeichnisse! Es enthält nur txt-Dateien. Folglich funktioniert Ihre Schleifenrekursion nicht wie erwartet, da der Zweig if(f.isDirectory()) niemals ausgeführt wird.

Hier ist ein kleines Wander Beispiel dafür, was Sie versuchen zu erreichen: Statt

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    public static void main(String[] args) { 
     List<File> results = new ArrayList<>(); 
     walk(new File("/home/lwi/Documents"),results); 

     System.out.println(results.size()); 

    } 

    public static void walk(File dir, List<File> accum) { 
     File[] files = dir.listFiles(); 

     if (files == null) 
      return; 

     for (File f : files) { 
      if (f.isDirectory()) 
       walk(f, accum); 
      else if (isTextFile(f)) 
       accum.add(f); 
     } 
    } 

    private static boolean isTextFile(File f) { 
     return f.getName().toLowerCase().endsWith(".txt"); 
    } 

} 
+0

Tnx, das ist einer für mich! –

3

Betrachten Sie mit dem java.nio.Files API. Es gibt einige vordefinierte Methoden zum Durchlaufen von Dateistrukturen:

Verwandte Themen