PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnisse werden nicht in der Rekursion geöffnet



Russel-Athletic
14-07-2005, 21:42
So ich hab ein kleines Programm geschrieben, was rekursiv durch die Verzeichnisse geht udn die Dateien in eine Liste einträgt. Doch komischerweise werden die Ordner einen Stufe tiefer nicht mehr als Ordner erkannt (genauer gesagt: "kein Dir: .." wird ausgegeben). Teilweise kann er bestimmte Ordner auch nicht öffnen. Am Ende geht er sogar gar nicht in die Rekursion und erkennt Ordner nur als Dateien. Hat jemand eine Ahnung woran es liegen könnte? Sprache ist übrigens c++.



int rekdir(string dirs)
{
DIR *aktdir;
struct dirent *aktdirzeiger;
struct dirent *merkdirzeiger;

if((aktdir=opendir(dirs.c_str()))==NULL)

{
cout << "Fehler beim öffnen" << endl;
}
else
{
while((aktdirzeiger=readdir(aktdir))!=NULL)
{
string aktdirn="";
aktdirn=(*aktdirzeiger).d_name;
//debug aktdir
//cout << aktdirn << endl;
//cout << aktdirn << aktdirn.find(".") << endl;
if(aktdirn.find(".")!=0)
{
if(opendir(aktdirn.c_str())==NULL)
{
cout << "kein Dir: " << aktdirn << endl;
listeeintragen(dirs, aktdirn);

}
else
{
cout << "Rekdir: " << aktdirn << endl;
rekdir(aktdirn);
}
}
}
if(closedir(aktdir) == -1)
{
cout << "Fehler beim schließen" << endl;
}
}
}

KL47
14-07-2005, 22:06
Versuch mal diese Änderung:


else
{
cout << "Rekdir: " << aktdirn << endl;
rekdir(aktdirn);
} wird zu
else
{
cout << "Rekdir: " << aktdirn << endl;

string tmp = dirs;
tmp += "/";
tmp += aktdirn;

rekdir(tmp);
} Ansonsten musst du noch schauen, dass er nicht ".." noch mal nimmt, ansonsten dauert es ziemlich lange ;), bis das Programm beendet wird.

Für "(*aktdirzeiger).d_name" kannst du übrigens auch "aktdirzeiger->d_name" schreiben :)

Russel-Athletic
15-07-2005, 10:13
int rekdir(string dirs)
{
//char[1000] dichinst;
//strcpy(dirchar,dichinst,1000);
DIR *aktdir;
struct dirent *aktdirzeiger;
struct dirent *merkdirzeiger;
cout << "here comes the dirs" << dirs << endl;

if((aktdir=opendir(dirs.c_str()))==NULL)

{
cout << "Fehler beim öffnen" << endl;
}
else
{
while((aktdirzeiger=readdir(aktdir))!=NULL)
{
string aktdirn="";
aktdirn=aktdirzeiger->d_name; //=(*aktdirzeiger).d_name
//debug aktdir
//cout << aktdirn << endl;
//cout << aktdirn << aktdirn.find(".") << endl;
if(aktdirn.find(".")!=0)
{
if(opendir(aktdirn.c_str())==NULL)
{
cout << "kein Dir: " << aktdirn << endl;
listeeintragen(dirs, aktdirn);

}
else
{
cout << "Rekdir: " << aktdirn << endl;
string tmp= dirs;
tmp += "/";
tmp += aktdirn;
rekdir(tmp);
}
}
}
if(closedir(aktdir) == -1)
{
cout << "Fehler beim schließen" << endl;
return(-1);
}
}
return(0);
}

Ich hab immernoch das Problem, dass er nicht einen tiefer geht. Irgendwie scheint was mit der Abfrage nicht zu funktionieren, allerdings weiß ich nicht was. Also um genauer zu sein, geht er ein Ordner runter (macht auch brav die Rekursion), erkennt aber dann die darin befindlichen Ordner nicht als Ordner.
Hier mal nen kleiner "Debug Output":


Rekdir: Comedy
TMP: /mnt/hdd1/mp3/Comedy
here comes the dirs /mnt/hdd1/mp3/Comedy
kein Dir: Ja_uff_erstmal

Außerdem meckert die glibc manchmal:


*** glibc detected *** double free or corruption (fasttop): 0x080707c0 ***
Aborted

locus vivendi
15-07-2005, 15:32
Also das "if(opendir(aktdirn.c_str())==NULL)" ist ein Ressourcenleck, denn wenn etwas ungleich 0 zurückgegeben wird, wird ja kein closedir auf das Resultat aufgerufen.

Übrigens, da du ja eh C++ verwendest, benutze nicht "NULL". Benutze einfach "0".

Mit den anderen Problemen kann ich dir leider nicht helfen.

KL47
15-07-2005, 19:14
Oh, da hab ich wohl nicht nachgedacht, bzw. nicht genau gelesen :D


if(aktdirn.find(".")!=0)
{
if(opendir(aktdirn.c_str())==NULL)
{
cout << "kein Dir: " << aktdirn << endl;
listeeintragen(dirs, aktdirn);

}
else
{
cout << "Rekdir: " << aktdirn << endl;
string tmp= dirs;
tmp += "/";
tmp += aktdirn;
rekdir(tmp);
}
} muss umgeändert werden in
if(aktdirn.find(".")!=0)
{
string tmp= dirs;
tmp += "/";
tmp += aktdirn;

if(opendir(tmp.c_str())==NULL)
{
cout << "kein Dir: " << aktdirn << endl;
listeeintragen(dirs, aktdirn);

}
else
{
cout << "Rekdir: " << aktdirn << endl;
rekdir(tmp);
}
}
Du kannst dir ja zuerst mal "aktdirn" ausgeben lassen und dann "tmp", dann siehst du vielleicht, worans gelegen hat. Ansonsten einfach nochmal fragen :)

Das mit dem Ressourcenleck stimmt, da solltest du die Anweisung mit "closedir" unter die größere if-Schleife packen.