# Dateipfade auslesen



## Ching-Lau (25. Jun 2010)

Hi,

ist es in Java möglich "alle" Dateipfade auszulesen?? Oder Dateipfade, in denen bestimmte Datein mit einer bestimmten Dateiendung vorkommen?? Also z.B. wenn es 2 .exe Dateien auf dem ganzen Rechner gibt, dann etwa so etwas zurückgegeben wird:

C:/Programme/***/***/test.exe
E:/Users/test2.exe

Ist dies möglich oder ist das zu "hardwarenah" für Java? Eigentlich müsste es jedoch funktionieren, da ja der JFileChooser auch auf diese Pfade zugreifen kann. 

Ching-Lau

PS: Eigentlich suche ich eine Methode, die nach bestimmten Dateiendungen sucht oder alle Pfade zurückgibt.


----------



## agentone (25. Jun 2010)

File (Java 2 Platform SE v1.4.2)

Die Klasse java.io.File:
-> listRoots() gibt dir alle Laufwerke zurück
-> listFiles() gibt alle Dateien und Ordner die sich in einem bestimmten Laufwerk oder Ordner befinden zurück
-> für deine Zwecke bei listFiles einen FilenameFilter übergeben
-> isFile() gibt zurück, ob es sich um eine Datei handelt

Implementierung:
Eine rekursiv arbeitende Methode, der ein File-Objekt und ein Filter übergeben wird. Das File-Objekt ruft listFiles(filter) auf. u.s.w.


----------



## Ching-Lau (25. Jun 2010)

Danke genau das habe ich gesucht =)


----------



## Ching-Lau (25. Jun 2010)

Noch eine Frage: Ist es möglich alle Pfade einer Festplatte (z.B. D zu bekommen?? Oder muss man da dann jeden Ordner einzeln mit listFiles() durchgehen??


----------



## agentone (25. Jun 2010)

Direkt alle Pfade bekommen geht nicht. Du musst rekursiv arbeiten. Leider.


----------



## Ching-Lau (25. Jun 2010)

Mmmhhh das klingt kompliziert... Ich werds mal versuchen =)


----------



## Ching-Lau (25. Jun 2010)

Hi,

Ich habe jetzt mal angefangen und es klappt auch bis zu 2 Unterordner. Jedoch gehe ich jedes einzeln durch (Siehe Quellcode). Gibt es auch eine einfachere Methode, bei der man nicht alles für jeden Unterordner wiederhohlen muss?? Denn ich weiß ja nicht wie viele Unterordner es gibt... Sonst müsste ich es 100 mal wiederhohlen um auch wirklich alles abzudecken.

Hier der Quellcode:

[Java]

File allc[] = new File("C:/").listFiles();

		HashMap<Integer, String> all = new HashMap<Integer, String>();

		File moment = new File("C:/");

		int y = 0;

		for (int i = 0; i < allc.length; i++)
		{

			all.put(y, "" + allc_);

			y++;

			moment = allc;

			if (allc.length() != 0)
			{

				File moment2[] = moment.listFiles();

				if (moment2 != null)
				{

					for (int i2 = 0; i2 < moment2.length; i2++)
					{

						all.put(y, "" + moment2[i2]);

						y++;

						moment = moment2[i2];

						if (moment2[i2].length() != 0)
						{

							File moment3[] = moment.listFiles();

							if (moment3 != null)
							{

								for (int i3 = 0; i3 < moment3.length; i3++)
								{

									all.put(y, "" + moment3[i3]);

									y++;

									if (moment3[i3].length() != 0)
									{

										// System.out.println("end");

									}

								}

							}

						}

					}

				}

			}

		}

		for (int i = 0; i < all.size(); i++)
		{

			System.out.println(i + ": " + all.get(i));

			try
			{
				Thread.sleep(1);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}

		}

[/code]_


----------



## agentone (25. Jun 2010)

Ich sagte doch: Arbeite rekursiv!
Rekursive Programmierung ? Wikipedia

So, oder so ähnlich kann das dann aussehen.

```
import java.io.*;
import java.util.*;

public class Crawler{
    private static Vector<File> files;

    public static void main(String[] args)
    {
      files=new Vector<File>(20,20);
      
      crawl(new File("C:/"));
      
      for(File f:files)
      {
        System.out.println(f.toString());
      }
    }
    
    public static void crawl(File file)
    {
       files.add(file);
       
       if(!file.isFile())
       {
         for(File f : file.listFiles())
         {
           crawl(f);
         }
       }
    }
}
```


----------



## Wortraum (26. Jun 2010)

Man kann es selbstverständlich auch iterativ lösen; hier ein Beispiel, um alle Verzeichnisse in eine Liste zu packen:

```
public static List<File> findDirectories(File start) {
    List<File> result = new ArrayList<File>();
    Stack<File> dirStack = new Stack<File>();
    if (start.isDirectory())
        dirStack.push(start);
    while (dirStack.size() > 0) {
        for (File f : dirStack.pop().listFiles()) {
            if (f.isDirectory()) {
                dirStack.push(f);
                result.add(f);
            }
        }
    }
    return result;
}
```
Die Methode listeFiles() kann aber noch die Ausnahme _NullPointerException_ werfen, wenn auf ein Verzeichnis nicht zugegriffen werden kann. Man sollte meinen, daß canRead() und canExecute() als Abfrage genügen sollten, aber auf einem Windows‐System bekomme ich selbsamerweise _true_ zurück, auch wenn ich keine Rechte darauf habe. Das entzog sich schon immer meinem Verständnis. Man kann aber natürlich vorher abfragen, ob listFiles() _null_ zurückgibt oder nicht.

*@agentone:*
Ein Vektor ist synchronisiert, was für Deinen Fall unnötig ist. Außerdem bedeutet !isFile() nicht, daß es ein Verzeichnis ist!


----------



## agentone (26. Jun 2010)

> Man kann es selbstverständlich auch iterativ lösen


Nein, wirklich? Aber um Bäume zu durchsuchen eignet sich die Rekursion eben mehr als die Iteration...


> Ein Vektor ist synchronisiert, was für Deinen Fall unnötig ist.


Und du glaubst jetzt, das die ArrayList schneller ist, oder wie?


> Außerdem bedeutet !isFile() nicht, daß es ein Verzeichnis ist!


Was könnte es denn sonst noch alles sein? Es gibt nur File,Directory und Root, wobei Root auch als Verzeichnis gewertet wird.


----------



## Wortraum (26. Jun 2010)

agentone hat gesagt.:


> Nein, wirklich? Aber um Bäume zu durchsuchen eignet sich die Rekursion eben mehr als die Iteration...


Doch, doch, das war mein Ernst. 



> Und du glaubst jetzt, das die ArrayList schneller ist, oder wie?


Grundsätzlich? Ja. Hier ist es ohnehin egal, und ich erwähnte es nur, weil häufig Vektor falsch eingesetzt oder zumindest ohne das Wissen verwendet wird, daß ein Vektor synchronisiert ist. Ein Hinweis darauf kann also nicht schaden, denke ich mir. 



> Was könnte es denn sonst noch alles sein? Es gibt nur File,Directory und Root, wobei Root auch als Verzeichnis gewertet wird.


Spezielle Dateien, beispielsweise Pipes, Sockets oder Treiberschnittstellen. Meines Wissens ist das abhängig vom Betriebssystem und nicht in Java spezifiziert.


----------



## agentone (27. Jun 2010)

> [...] weil häufig Vektor falsch eingesetzt oder zumindest ohne das Wissen verwendet wird, daß ein Vektor synchronisiert ist.


Ich wusste, dass Vector synchronisiert ist. Und ich habe es mir angewöhnt diesen zu verwenden, egal ob ich diese spezielle Eigenschaft benötige oder nicht. Auch wenn ihn manche als Quasi-Deprecated empfinden.



> Spezielle Dateien, beispielsweise Pipes, Sockets oder Treiberschnittstellen.


Aha, und die können alle mit einem File-Objekt dargestellt, bzw. durch listFiles() zurückgegeben werden??


----------



## Wortraum (27. Jun 2010)

agentone hat gesagt.:


> Aha, und die können alle mit einem File-Objekt dargestellt, bzw. durch listFiles() zurückgegeben werden??


Ja, es handelt sich um normale Verzeichniseinträge, aber nicht um normale Dateien.


----------

