Dateipfade auslesen

  • Themenstarter Themenstarter Ching-Lau
  • Beginndatum Beginndatum
C

Ching-Lau

Gast
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.
 
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.
 
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??
 
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]
 
Ich sagte doch: Arbeite rekursiv!
Rekursive Programmierung ? Wikipedia

So, oder so ähnlich kann das dann aussehen.
Java:
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);
         }
       }
    }
}
 
Man kann es selbstverständlich auch iterativ lösen; hier ein Beispiel, um alle Verzeichnisse in eine Liste zu packen:
Java:
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!
 
Zuletzt bearbeitet:
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.
 
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.
 
Zuletzt bearbeitet:
[...] 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??
 

Neue Themen


Zurück
Oben