# Rekursive Dateisuche



## alaska94 (13. Nov 2006)

Hallo,

ich möhte in einer Verzeichnisstruktur Dateien mit einer bestimmten Endung suchen.
Ich möchte alle Dateien suchen die mit der Dateiendung.txt enden.
Ich möchte zählen wieviele Dateien mit dieser Endung in jedem Ordner sind.
Das erse Problem ist, dass ich die Verzeichnisstruktur durchsuchen muss. Danach die Dateiendungen und dann noch jeweils in jedem Ordner zählen wieviele Dateien mit der Endung .txt sind.

Kann mir einer sagen wie ich das realisiere?
Wie ist der Befehl um die Endungen auszulesen?

Gruß

Markus


----------



## Murray (13. Nov 2006)

Sieh dir mal die Klasse java.io.File an, bes. die (überladenen) Methoden list und listFiles sollten interessant sein.

Die Extension kann man nicht direkt auslesen, dazu muss man den String zerlegen.

```
public String getExtension( File f) {
  String fn = g.getName();
  int idx = fn.lastIndexOf( ".");
  return (idx < 0) null : fn.substring( idx+1, fn.length()); //-- liefert Extension ohne Punkt
}
```


----------



## Bert Brenner (13. Nov 2006)

Und mit der Klasse File bist du in der Lage Verzeichnisse durchzugehen.


----------



## Bert Brenner (13. Nov 2006)

In der Javainsel ist glaub ich auch noch ein Beispiel für das Rekursive wandern durch Verzeichnisse.

PS: Verdammt, hab ich wohl den Editierbutton nicht getroffen, sorry.


----------



## L-ectron-X (13. Nov 2006)

Murray hat gesagt.:
			
		

> Die Extension kann man nicht direkt auslesen, dazu muss man den String zerlegen.
> 
> ```
> public String getExtension( File f) {
> ...



Mal davon abgesehen, dass dein Code nicht funktionieren würde, kann man die Dateiextension mit
_file.getName().endsWith(suffix)_ filtern.
Eine Klasse die das erledigt habe ich mal vor einiger Zeit hier gepostet:
http://www.java-forum.org/de/viewtopic.php?t=22482

Eine Rekursion müsste da allerdings noch implementiert werden.


----------



## Murray (13. Nov 2006)

L-ectron-X hat gesagt.:
			
		

> Mal davon abgesehen, dass dein Code nicht funktionieren würde, kann man die Dateiextension mit
> _file.getName().endsWith(suffix)_ filtern.



Asche auf mein Haupt: zwei Vertipper in so einer kurzen Methode...

```
public String getExtension( File f) {
		String fn = f.getName();
		int idx = fn.lastIndexOf( ".");
		return (idx < 0) ? null : fn.substring( idx+1, fn.length()); //-- liefert Extension ohne Punkt
	}
```


Aber Du hast natürlich Recht, wenn es - wie in der Aufgabenstellung beschreiben - nur darum geht, zu zählen, wieviele Dateien mit der entsprechenden Erweiterung da sind, reicht endsWith. Allerdings sollte man - ob man nun die Extension als String extrahiert oder mit endsWith vergleicht - im Hinterkopf behalten, dass es Dateisysteme gibt, die zwischen Gross- und Kleinschreibung nicht unterscheiden. Dort würde man wohl erwarten, dass BILD.GIF bei den Dateien mit der Extension ".gif" mitgezählt wird. Die Bedingung müsste in diesem Fall etwas erweitert werden. Aber das ist ja mit beiden Ansätzen möglich.


----------



## L-ectron-X (13. Nov 2006)

Ja, da hast du vollkommen Recht!  
Ums nun noch zu vervollständigen: Für diese Systeme kann mit equals() auf Gleichheit geprüft werden. Für Systeme, die das nicht tun, geht das mit den Methoden toUpperCase() bzw. toLowerCase() aus String.


----------



## kaie (13. Nov 2006)

Hier ist eine einfache rekursive Variante:

```
public int zaehleTextdateien( File f )
{
  int n=0;
  File[] list = f.listFiles();
  for( int i=0; i<list.length; i++ )
  {
    if( list[i].isDirectory() )
      n+=zaehleTextdateien(list[i]);
    else if( list[i].getName().toLowerCase().endsWith(".txt")
      n++;
  }
  return n;
}
```
Einfach aufrufen mit:

```
System.out.println( "Anzahl der Textdateien im Hauptverzeichnis: "+zaehleTextdateien( new File("c:\\") );
```


----------



## alaska94 (13. Nov 2006)

Danke für eure schnelle Hilfe. Ich werde mir mal alles ansehen und mir das zusammenbasteln.
Es wird so laufen , dass ich untersuchen muss ob mehr als 5 Textdateien in einem Ordner sind, wenn es so ist, sollen sie woanderes hin kopiert werden. Wenn nicht geht es in den nächsten Ordner

Gruß

alaska


----------



## alaska94 (13. Nov 2006)

Das Projekt hast sich leider geändert.
Es sind verschiedene Dateien in einem Verzeichnis.
Ich suche jetzt nach einer .txt Datei.
Jetzt muss ich den Namen bilden, dieses ist nicht schwer. Der Pfad besteht aus dem Dateinamen ohne .txt.

Beispiel

Hallo.txt
Pfad=Hallo.

Jetzt muss ich in diesem Verzeichnis die Datein zählen, die mit Hallo anfangen.
Alle Dateien, die mit Hallo anfangen, gehören zu einer Projektgruppe.

Wenn es mehr als 5 sind, sollen sie in ein Verzeichnis geschoben werden, das den gleichen Namen wie den Pfad hat, in diesem Beispiel "Hallo".
Wenn es weniger als 5 sind, sollen sie in das Verzeichnis Mülleimer geschoben werden.
Die Restlichen Dateien, die übrig bleiben, sollen ebenfalls in das Verzeichnis Mülleimer verschoben werden.

1. Problem es gibt mehrerer .txt Dateien in einem Verzeichnis. also auch mehrere Projektgruppen in einem Verzeichnis.
2. Problem es ist leider nicht gesagt, dass die .txt Datei immer als erstes steht.

Wie kann ich die Dateien so vorsortieren, das immer als erstes eine .txt Datei folgt, und anschließend die dazugehörige Projektgruppe?

Gruß

Alaska


----------



## thE_29 (13. Nov 2006)

@Lectronx: oder ganz einfach equalsIgnoreCase()


----------



## dieta (13. Nov 2006)

Da hab ich irgendwann auch mal hier was gepostet... ist sogar in den FAQs verlinkt: http://www.java-forum.org/de/viewtopic.php?p=201400#201400 
Und ist sogar rekursiv.


----------



## André Uhres (14. Nov 2006)

dieta hat gesagt.:
			
		

> ... ist sogar in den FAQs verlinkt..


Verzeichnisse durchsuchen/bearbeiten/auslesen


----------

