# Alle Files im Ordner nach Dateinamen durchsuchen



## fantrixx (20. Mrz 2006)

Hi all,

ich bin nun vor ein Problem und würde eure Tips dazu wissen.
Ich schreibe gerade ein Programm und will in diesem Programm sowas wie
eine Suchfunktion einbinden. Der Benutzer gibt in einem TextFeld das
ein was er suchen möchte und bestätigt mit einem Button. So dann soll
der Rechner sich das eingegebene nehmen und dann eine festen Ordner
nach dem Namen suchen. Der Name nachdem gescuht werden soll steht als
Dateiname schon drine.
Es sind alles Textdateien.
Bsp:

User Suchbegriff = "Peter"

Nun soll er im Ordner alle Textdateien durchsuchen nach einer Datei die
irgendwas mit "Peter" zu tun hat.
Die Datei kann auch: "Hallo Peter.txt" heißen und er sollte die Datei
ausgeben in einer liste.

Ich bitte euch um Vorschläge.

Ps: Mein größtest Problem ist es den PC klar zumachen das er alle
Dateien im Ordner durchsuchen soll.

mfg

Fantrixx


----------



## meez (20. Mrz 2006)

Rekursion heisst das Zauberwort....


----------



## fantrixx (20. Mrz 2006)

OK, das ist mir auch schon klar nur weiss ich nich nicht so recht, wie ich anfangen sollte ?!


----------



## L-ectron-X (20. Mrz 2006)

In diesem Thread findest du eine Klasse, die alle Dateien eines Verzeichnisses in einem Array sammelt und zurückgibt. Du kannst auch Dateien eines bestimmten Typs vorgeben. Im Prinzip brauchst du dann nur noch das Array durchlaufen und dir die Dateien nach deinen Kriterien ansehen.

Vielleicht kannst du es gebrauchen.


----------



## meez (20. Mrz 2006)

Oder hier:


```
public void getRecursiveFiles(List files, File baseDirectory, boolean addDirectories) {
		File[] f = baseDirectory.listFiles();		
		for (int n = 0; n < f.length; n++) {
			if (f[n].isDirectory()) {
				if (addDirectories) {
					files.add(f[n]);
				}
				getRecursiveFiles(files, f[n], addDirectories);
			} else {
				files.add(f[n]);
			}
		}
	}
```

Aufrufen:


```
List files = new ArrayList();
	getRecursiveFiles(file, new File("."), false);
	//Ab hier ist die Liste mit allen Files gefuellt
```


----------



## fantrixx (20. Mrz 2006)

Ich bin noch dabei das nachzu volziehen  kann noch bischen dauern


----------



## L-ectron-X (20. Mrz 2006)

Lass dir Zeit, wir laufen nicht weg. :wink: 
Rom wurde schließlich auch nicht...


----------



## fantrixx (20. Mrz 2006)

meez hat gesagt.:
			
		

> Oder hier:
> 
> 
> ```
> ...



Was hier nicht verstehe ist wo nachdem Wort gesucht wird das der Benutzer in das Textfeld eingegeben hat ?

EDIT: Achja und was ist das baseDirectory ? ist das der ordner in dem er suchen soll ?

EDIT2: ich habe in dem Code noch ein Fehler gefunden unzwar bei "files.add(f[n]);" wird f[n] übergeben aber man darf dort kein object übergeben es geht nur String.


----------



## meez (20. Mrz 2006)

Hier wird gar nichts "gesucht"...Das sammelt nur alle Files zusammen...
Ein wenig musst du schon selber uebrlegen...


----------



## fantrixx (20. Mrz 2006)

Also sammelt es alle Files zusammen und added es in die Liste ? Und bitte auf EDIT2 von meine vorherigen Post schauen


----------



## meez (20. Mrz 2006)

> EDIT2: ich habe in dem Code noch ein Fehler gefunden unzwar bei "files.add(f[n]);" wird f[n] übergeben aber man darf dort kein object übergeben es geht nur String.



 :?:  Das ist alles ok..Da wird das File zur Liste hinzugefügt...
Jetzt gehst du halt die List durch, und schaust ein wenig mit indexOf(), ob der Suchbegriff im Namen oder in der Datei vorkommt...


----------



## fantrixx (20. Mrz 2006)

aber laut API und compiler geht das nicht. Man kann nur Strings adden ?! Oder irre ich mich da ?


----------



## meez (20. Mrz 2006)

fantrixx hat gesagt.:
			
		

> aber laut API und compiler geht das nicht. Man kann nur Strings adden ?! Oder irre ich mich da ?



Naja...kommt auf die API an...In der Java 1.X API steht das jedenfalls nicht...


----------



## fantrixx (20. Mrz 2006)

http://java.sun.com/j2se/1.3/docs/api/

ist die API die ich benutze.


----------



## fantrixx (20. Mrz 2006)

Oh sch*** meiN Fehler Sorry habe falsch geguckt *schäm*


----------



## fantrixx (20. Mrz 2006)

Ich komme zurzeit nicht weiter. Ich bin jetzt gerade dabei alle Dateien auszulesen und in eine Liste zu packen um danach die DateiNamen mit indexOs() durch zu suchen. Nur kommen immer diese Dummen Fehler wie z.b:


```
search.java:58: cannot resolve symbol
symbol  : class ArrayList 
location: class search
         files = new ArrayList();
                     ^
search.java:76: cannot resolve symbol
symbol  : method add (java.io.File)
location: class java.awt.List
                   files.add(f[n]);
                        ^
search.java:80: cannot resolve symbol
symbol  : method add (java.io.File)
location: class java.awt.List
               files.add(f[n]);
                    ^
3 errors
```


Unten siehst du mal mein Programm wie weit es zurzeit ist ...




```
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class search extends Frame {
  // Anfang Variablen
  private TextField searchTF = new TextField();
  private Button searchB = new Button();
  private List results = new List();
  public String searchS = "";
  public boolean found = false;
  public String searchDir = "";
  public String[] dataList;
  lyric l1;
  public int anzahl;
  List files;

  // Ende Variablen

  public search(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    searchTF.setBounds(96, 8, 185, 24);
    searchTF.setText("");
    cp.add(searchTF);
    searchB.setBounds(8, 8, 75, 25);
    searchB.setLabel("Search");
    cp.add(searchB);
    searchB.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        searchBActionPerformed(evt);
      }
    });

    results.setBounds(8, 48, 273, 217);
    cp.add(results);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public void searchBActionPerformed(ActionEvent evt) {
         searchS = searchTF.getText();
         count();
         files = new ArrayList();
         searchIt(results, new File(l1.saveS), false);
  }
  public void count() {
         File dir = new File(l1.saveS);
         File[] arr = dir.listFiles(new FilenameFilter(){
            public boolean accept(File dir, String name) {
                if(name.toLowerCase().endsWith(".txt")) return true;
                return false;
            }
         });
         anzahl = arr.length;
  }
  public void searchIt(List files, File baseDirectory, boolean addDirectories) {
         File[] f = baseDirectory.listFiles();
         for (int n = 0; n < f.length; n++) {
             if (f[n].isDirectory()) {
                if (addDirectories) {
                   files.add(f[n]);
                }
                searchIt(files, f[n], addDirectories);
             } else {
               files.add(f[n]);
             }
         }
  }
  public void getClass(lyric l1) {
         this.l1 = l1;
  }
  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new search("search");
  }
}
```


----------



## tini (20. Mrz 2006)

import java.util.*


----------



## fantrixx (20. Mrz 2006)

Das importieren hat zur folge:



> search.java:11: reference to List is ambiguous, both class java.util.List in java.util and class java.awt.List in java.awt match
> private List results = new List();
> ^
> search.java:18: reference to List is ambiguous, both class java.util.List in java.util and class java.awt.List in java.awt match
> ...


----------



## Sky (20. Mrz 2006)

weil es eine java.awt.List und eine java.util.List gibt... wenn Du beides importierst, so ist nicht klar, welche gemeint ist...

also entweder Importe anpassen oder java.util.List verwenden.


----------



## fantrixx (20. Mrz 2006)

Stimmt habe ich auch eben erst gelöst 
Nun aber sagt er mir immer noch die gleichen Erros:



> search.java:58: cannot resolve symbol
> symbol  : class ArrayList
> location: class search
> files = new ArrayList();
> ...



Was mit hierbei bischen Strange vorkommt ist die deklaration:


```
List files = new ArrayList();
```


----------



## bygones (20. Mrz 2006)

er erkennt files nicht als java.util.List an, sondern als java.awt.List, daher kennt er die entsprechenden Methoden nicht.

wie schon gesagt - entweder die imports korrekt anpassen oder explizit immer sage java.util.List


----------



## meez (20. Mrz 2006)

fantrixx hat gesagt.:
			
		

> Was mit hierbei bischen Strange vorkommt ist die deklaration:
> 
> ```
> java.util.List files = new ArrayList();
> ```



Du kannst auch alle List's durch ArrayList ersetzen...(oder Vector)
Ich benutz halt lieber das Interface, da ich dann unabhängig von der Impl bin.


```
ArrayList files = new ArrayList();
```


----------



## fantrixx (21. Mrz 2006)

Hi, so nachdem ich nun ein Tag drüber geschlafen habe bin ich auf eine neue Idee gekommen. So erstmal mein Code:


```
public void searchNow() {
         System.out.println("**Start to Search**");
         for(int i = 0; i <= anzahl; i++) {
                 f1[i] = new File(saveS);
                 System.out.println(f1[i].listFiles());
         }
         System.out.println("**Search Complete**");
  }
```

Ich werde versuchen erstmal mit der Methode oben alle Strings die in dem Ordner sind auszulesen und dann werde ich diese Array Liste mit .getName() in String arrays abspeichern und danach wohl mit indexOf() oder irgendwas anderes Bearbeiten ?! Ich weiss das gleiche habt ihr auch gesagt  aber mir ist meine Lösung bischen einfacher  
Am besten mal eure meinungen rein schreiben.

EDIT: Ach ja nur so zwischen durch er bekommt eine NullPointer Ex. bei:


```
f1[i] = new File(saveS);
```

die Var. saveS gibt es und es steht auch das was drine.
File f1[] wurde auch schon angegeben ?


----------



## meez (21. Mrz 2006)

:?:  Das was du da hast, macht gar nichts...

Hier, hab grad einen guten Tag:

```
public static void main(String[] args) {

		String search = "<dein suchstring>";
		File basedir = new File("<Dein basis-such directory>");

		List files = new ArrayList();
		List found = new ArrayList();		
		getRecursiveFiles(files, basedir, false);
		for (int n = 0; n < files.size(); n++) {
			File file = (File) files.get(n);
			if (file.getAbsolutePath().indexOf(search) > -1) {
				found.add(file);
				continue;
			}			
			try {
				BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
				for (String buffer; (buffer = in.readLine()) != null;) {
					if (buffer.indexOf(search) > -1) {
					found.add(file);
					break;
				}
				in.close();				
			} catch (IOException e) {}
		}

		// Hier sind in der Liste "found" alle Files, 
		// die entweder im Namen oder im Inhalt den Suchstring search enthalten

	}
```


----------



## fantrixx (21. Mrz 2006)

So der erste Teil ab dem "if" schaut auf den Dateinamen? oder ?
Und der zweite teil ab dem "try" schaut in die Datei hinein ?

Gut ok nun frage ich mich woher die Methode  "getRecursiveFiles" herkommt ?


----------



## meez (21. Mrz 2006)

fantrixx hat gesagt.:
			
		

> Gut ok nun frage ich mich woher die Methode  "getRecursiveFiles" herkommt ?




Ueber die haben wir die letzten 15 Posts geredet...:!: 
Ein bisschen selbst mitdenken würde nicht stören *kopfschüttel*....


----------



## fantrixx (21. Mrz 2006)

ja gut ok sorry ich bin heute eh kagge drauf und total vergeslig.


----------



## fantrixx (21. Mrz 2006)

So ich habe mir nun noch eine eigene Methode gebastelt und habe das raus:


```
File[] files = file.listFiles(new FilenameFilter() {
     public boolean accept(File dir, String name) {
         File f = new File(dir, name);
         return (f.isFile() & f.getName().indexOf(search) != -1);
     }

});
```

Sie ist noch nicht ganz fertig hat nur noch einen kleinen Fehler aber ich komme nicht auf die Lösung...
Was haltet ihr von der Methode.

Habe mir selbsteine gemacht, weil die Lösungen von euch mir bischen zu hoch waren.


----------



## meez (21. Mrz 2006)

```
File[] files = file.listFiles(new FilenameFilter() {
     public boolean accept(File file) {
       return !file.isDirectory() && file.getName().indexOf(search) != -1;
     }
});
```


So...Sucht einfach nicht rekursiv...


----------

