Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Verzeichnisse werden nicht in der Rekursion geöffnet

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.07.2005
    Beiträge
    16

    Verzeichnisse werden nicht in der Rekursion geöffnet

    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++.

    Code:
    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;
    		}
    	}
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Versuch mal diese Änderung:

    Code:
    					else 
    					{
    						cout << "Rekdir: " << aktdirn << endl;
    						rekdir(aktdirn);
    					}
    wird zu
    Code:
    					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
    I've Got To Say, Without The Beard You Look At Least Eighty Years Younger

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.07.2005
    Beiträge
    16
    Code:
    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":
    Code:
    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:
    Code:
    *** glibc detected *** double free or corruption (fasttop): 0x080707c0 ***
    Aborted
    Geändert von Russel-Athletic (15-07-2005 um 10:19 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50
    Oh, da hab ich wohl nicht nachgedacht, bzw. nicht genau gelesen

    Code:
    				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
    Code:
    				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.
    Geändert von KL47 (15-07-2005 um 19:17 Uhr)
    I've Got To Say, Without The Beard You Look At Least Eighty Years Younger

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •