Dateisuche in Linux

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hi,

mit folgendem code suche ich erfolgreich in windows einen ordner "file".
in linux bleibt das programm aber bei "starte" kleben, zu "bereit" kommt es nie.
es hängt also irgendwie in der funktion "search".
was läuft hier falsch? warum gehts in windows aber linux nicht?

Code:
//...
//start in textbox ausgeben
t.append("Starte...");
File[] drives = File.listRoots();
for(int i = 0; i < drives.length; i++ )
{
        search(drives[i],file);
}
//bereit ausgeben
t.append("Bereit...");
//...
public static void search(File dir,String file)
{
        File[] directories=dir.listFiles();
        for(int ctr=0;ctr<directories.length;ctr++)
        {
                if(directories[ctr].isDirectory())
                {
                        if(directories[ctr].listFiles()!=null)
                                search(directories[ctr],file);
                }
                else
                {
                        if(directories[ctr].getName().equals(file))
                        {
                                directory = directories[ctr].getAbsolutePath();
                        }
                }
        }
}
 
Mit Linux wirst du vermutlich eine NullPointerException bekommen. Der Grund ist, das du wohl kein Leserecht für root hast und daher null zurückgeliefert wird.
 
Streue da noch paar Aufrufe von File#canRead() ein. Unter Linux kannst du, je nach dem als was du angemeldet bist,
nicht in jedes Verzeichnis rein. Ansonsten Debuggen und nachschauen, wo es hängen bleibt. Zwischen den zwei Ausgaben
passiert ja recht viel.
 
auch wenn ich es als root ausführe passiert nichts, denke das dürfte die rechtevergabe umgehen, oder?
wie debugge ich denn?
ich habs in eclipse versucht, aber da kommt immer ne fehlermeldung "source not found".
hab ich mal gegooglt, aber auf ne vernüftige lösung bin ich nicht gekommen.
 
Ich hab die Sache mal kompilierfähig umgeschrieben und bei mir funktioniert es.
Mach dir ein paar debug System.outs wenn du mit dem Debugger nicht klar kommst.
 
kannst du mal ein beispiel mit dem debug system.outs geben?
wo setze ich die am besten ein?
 
Code:
              if(directories[ctr].isDirectory())
                {
                        System.out.println(directories[ctr]);
                        if(directories[ctr].listFiles()!=null)
                                search(directories[ctr],file);
                }
 
Das Programm fand zwar die Datei, lief aber in Endlosschleife.
Vermutlich bedingt durch das Linux-Dateisystem.
Breche nun die Ausführung nach dem ersten Fund ab, so gehts.
 
Anonymous hat gesagt.:
in linux bleibt das programm aber bei "starte" kleben, zu "bereit" kommt es nie.
es hängt also irgendwie in der funktion "search".
was läuft hier falsch? warum gehts in windows aber linux nicht?
Möglicherweise hast du unter Linux in deinem Filesystem einen symbolischen Link, der rekursiv verschachtelt ist. Das würde erklären, warum dein Programm hängen bleibt. Denn wenn eine Exception geschmissen würde, wärst du ja schonmal einen Schritt weiter. Test also erstmal in einem Teilbereich deiner Festplatte, z.B. dein Home-Dir oder ein(!) eigens dafür angelegtes Unterverzeichnis mit einer Datei drin.

Statt:
Code:
File[] drives = File.listRoots();
schreibst du dann etwas in der Art (ist nicht getestet):
Code:
File[] drives;
drives[0] = new File("/home/user/myDir");

Da du unter Linux ohnehin nur EIN Root-Dir hast, kannst du den Aufruf von search() auch noch vereinfachen:
Code:
search(new File("/"), file);
(um zu testen, ob in der Schleife irgendwas schief läuft).

Gast hat gesagt.:
Das Programm fand zwar die Datei, lief aber in Endlosschleife.
Vermutlich bedingt durch das Linux-Dateisystem.
Breche nun die Ausführung nach dem ersten Fund ab, so gehts.
An welcher Stelle war da deine Endlosschleife: in der äußeren for-Schleife oder innerhalb von search? Konkret: welcher Zweig wird da immer wieder durchlaufen?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben