# Ordner und Unterordner nach Dateien durchsuchen



## JimK (7. Jul 2011)

Hi,

ich habe eine Methode geschrieben um einen Ordner zu durchsuchen. Leider bezieht die Methode die Unterordner nicht mit ein. Ich hab schon einiges gefunden, aber ich weiß nicht, wie ich es auf meine Methode anweden kann, weil ich eine Dateifilter benutze.
Kann mir jemand helfen?


```
public File[] Verzeichnis()
	{
		JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        int returnVal = fc.showOpenDialog(null);
        File f = null;
        File[] files = null;
        if (returnVal == JFileChooser.APPROVE_OPTION)
        {
            f = fc.getSelectedFile();
            files = f.listFiles(new FilenameFilter()
            		{

						@Override
						public boolean accept(File f, String name) {
							
							return name.endsWith("dat");
						}
            	
            		});
            
            for(File d: files){
                System.out.println(d.getName());
            }
//            System.out.println(f);
//            System.out.println(f.getPath());
        }
		
		return files;
		
	}
```


----------



## Volvagia (7. Jul 2011)

Vom Hirn (Instinkt) in die Tasten.


```
public File[] searchInFolder() //Methodenname klein und besser sagen was sie machen, nicht was zurückkommt.
{
	JFileChooser fc = new JFileChooser(); //In einer anderen Methode durchführen und dann diese hier aufrufen?
	fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
	int returnVal = fc.showOpenDialog(null);
	
	LinkedList<File> result = new LinkedList<File>();
	if (returnVal == JFileChooser.APPROVE_OPTION)
	{
		FilenameFilter filter = new FilenameFilter() { //In eine Klassenkonstante ablegen?
            public boolean accept(File f, String name) {
            	return(f.isDirectory() || name.endsWith(".dat"));
            }
        };
        
        searchRecursiv(fc.getSelectedFile(), filter, result);
	}
	
	for(File f:result)
		System.out.println(f.getName());
	
	return(result.toArray(new File[result.size()]));
}
private void searchRecursiv(File currentFolder, FilenameFilter filter, List<File> result)
{
	File[] content = currentFolder.listFiles(filter);
	
	for(File f:content)
	{
		if(f.isDirectory())
		{
			searchRecursiv(f, filter, result);
			return;
		}
		result.add(f);
	}
}
```


----------



## JimK (7. Jul 2011)

Hey Danke Volvagia. Soweit funktioniert es, aber es gibt noch ein Problem. Was ist wenn ein Ordner mehrere Unterordner mit Dateien beinhaltet? Mit dem jetzigen Beispiel wird nur immer im ersten Ordner gesucht. Der zweite Ordner wird dann gar nicht beachtet.


----------



## Volvagia (7. Jul 2011)

Ups, Flüchtigkeitsfehler. Du musst das return; in Zeile 33 mit einen continue; ersetzen.


----------



## JimK (7. Jul 2011)

Ok, hab es jetzt etwas abgeändert. Das Ordnerproblem taucht nicht mehr auf, aber dafür funktioniert der Filter nicht mehr. 


```
private void searchRecursiv(File currentFolder, FilenameFilter filter, LinkedList<File> result)
	{
	    File[] content = currentFolder.listFiles(filter);
	    
	    for(File f:content)
	    {
	        if(f.isDirectory())
	        {
	            searchRecursiv(f, filter, result);
//	            return;
	        }
	        else
	        {
	        	
	        	result.add(f);
	        }
	    }
	}
```


----------



## JimK (7. Jul 2011)

Mit dem continue funktioniert es auch. 
Aber es werde noch immer alle Dateien angezeigt und nicht nur die ".dat".


----------



## Volvagia (7. Jul 2011)

Ich kenne den FilenameFilter nicht. Kannst dir ja deine eigene Methode schreiben:


```
public File[] searchInFolder()
{
	JFileChooser fc = new JFileChooser();
	fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
	int returnVal = fc.showOpenDialog(null);
	
	LinkedList<File> result = new LinkedList<File>();
	if (returnVal == JFileChooser.APPROVE_OPTION)
		searchRecursiv(fc.getSelectedFile(), result);
	
	for(File f:result)
		System.out.println(f.getName());
	
	return(result.toArray(new File[result.size()]));
}
private void searchRecursiv(File currentFolder, List<File> result)
{
	File[] content = currentFolder.listFiles();
	
	for(File f:content)
	{
		if(f.isDirectory())
			searchRecursiv(f, result);
		else if(isFileValid(f))
			result.add(f);
	}
}
private boolean isFileValid(File f)
{
	return(f.getName().endsWith(".dat"));
}
```

Natürlich könntest du statt der Methode auch direkt die des Filters aufrufen, aber in dem Fall finde ich das einfach einfacher.


----------



## JimK (7. Jul 2011)

Sehr genial Volvagia. Jetzt funktioniert es.  Ich hatte es noch mal mit dem Ansatz von "Java ist auch nur eine Insel" versucht, aber irgendwie hat es nicht funktioniert.
Aber jetzt klappt es. Danke!!!


----------

