Ordnerstruktur von einem Laufwerk

excSchaKaL

Grünschnabel
HI,
und zwar hab ich mal ne Frage.
Ich würde gerne die komplette Ordnerstruktur anzeigen von Laufwerk c:\

mein quellcode sieht wie folgt aus.
Code:
void PrintDirectory(char *pPath)
{
	char path[_MAX_PATH];
	char nextLevel[_MAX_PATH];
	strcpy (path, pPath);
	strcat (nextLevel, "*.*");

	WIN32_FIND_DATA FileData; 

	HANDLE hfind = FindFirstFile(path, &FileData);


	int FindMoreFiles; 
	int dir = 0;
	int file  = 0;

	
	if (hfind != INVALID_HANDLE_VALUE)
	{
		do
		{
			if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{      				
				cout<< "<Ordner> " << FileData.cFileName << endl <<endl;

				strcat (FileData.cFileName, "\\");
				strcat (path, FileData.cFileName);

				cout << "testausgabe:" << path << endl; // testausgabe

				strcpy (nextLevel, path);
				
				PrintDirectory(nextLevel);

				cout << nextLevel << endl; // testausgabe
				
				dir++; 
			}
    
			else 
			{
				cout << "<Datei>  " << FileData.cFileName << endl; 
				file++; 
			}  
			
			FindMoreFiles = FindNextFile(hfind,&FileData);
		} while (FindMoreFiles);

	}
	
	else
	{
		cout << "Dieser Datentraeger\\Ordner ist leer." << endl;
	}

	FindClose (hfind);
	
	cout << endl << "Insgesamt" << endl;
	cout << "Ordner:  "<< dir << endl;
	cout << "Dateien: "<< file << endl << endl;
}
und in der Main steht folgendes.
Code:
PrintDirectory("c:\\");
cout << "Druecken Sie eine Tasten um ins Menu zu gelangen." << endl;
getch ();

ausgegeben wird nun immer das.

Code:
<Ordner> WINNT

testausgabe:c:\*.*blaaa\Dokumente und Einstellungen\HajoDial\Hd_test\Programme\R
ECYCLER\SVN_Projekte\SVN_Repos\System Volume Information\Temp\test\WINNT\
Dieser Datentraeger\Ordner ist leer.

Insgesamt
Ordner:  0
Dateien: 0
Er hängt also jeden Ordner immer hinten drann.
Was ich komisch find is der Teil --> "*.*" , aber wenn ichs raus mach, geht es gar nich.

vielen Dank im Vorraus
 
Du veränderst immer deinen Übergabeparameter. Wenn du einmal PrintDirectory mit Unterverzeichnis aufgerufen hast, und der eine Aufruf fertig ist, hast du in der ersten Instanz den originalen Ausgangsparameter nicht mehr. Da steht dann der Unterverzeichnisname mit drin.

Also entweder Kopie anlegen und const char* übergeben oder gleich auf std::string wechseln (und dann const std::string& übergeben.
 
Du arbeitest mit rekursivem Aufruf. Das ist für so einen Fall ideal.

Ich habe mich vorher übrigens verguggt, und einen falschen Fehler gemeldet. Also gleich vergessen.

Das eigentliche Problem ist, dass der Pfad, der beim rekursiven Aufruf übergeben wird, bereits ein *.* enthält. Das gibt dann innerhalb der Routine wieder Probleme (bzw. einen ungültigen Pfad).

Zusätzlich ist ein hässlicher Bug drin (der meistens aber nicht zum Absturz führt): Das strcat (nextLevel, "*.*"); am Anfang der Routine hängt *.* an einen nicht initialisierten String an. Das gibt 100% Probleme, meistens nicht sofort, aber später.

Ausserdem muss bei den Unterverzeichnissen eine Überprüfung rein, ob man die furchtbar sinnvollen Verzeichnisse "." oder ".." erwischt hat. Bei diesen darf man nicht rekursiv aufrufen. Man kann sie einfach überspringen.

Hier mal der abgeänderte Code, der scheint soweit zu laufen:

Code:
void PrintDirectory(char *pPath)
{
	char path[_MAX_PATH];
	char nextLevel[_MAX_PATH];
	strcpy (path, pPath);
  // AUA!
	strcat (path, "*.*");

	WIN32_FIND_DATA FileData; 

	HANDLE hfind = FindFirstFile(path, &FileData);


	int FindMoreFiles; 
	int dir = 0;
	int file  = 0;

	
	if (hfind != INVALID_HANDLE_VALUE)
	{
		do
		{
			if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{      				
        if ( ( strcmp( FileData.cFileName, "." ) )
        &&   ( strcmp( FileData.cFileName, ".." ) ) )
        {
				  cout<< "<Ordner> " << FileData.cFileName << endl <<endl;

				  strcat (FileData.cFileName, "\\");

          // HIER
          strcpy (path, pPath);
				  strcat (path, FileData.cFileName);

				  cout << "testausgabe:" << path << endl; // testausgabe

				  strcpy (nextLevel, path);
  				
				  PrintDirectory(nextLevel);

				  cout << nextLevel << endl; // testausgabe
  				
				  dir++; 
        }
			}
    
			else 
			{
				cout << "<Datei>  " << FileData.cFileName << endl; 
				file++; 
			}  
			
			FindMoreFiles = FindNextFile(hfind,&FileData);
		} while (FindMoreFiles);

	}
	
	else
	{
		cout << "Dieser Datentraeger\\Ordner ist leer." << endl;
	}

	FindClose (hfind);
	
	cout << endl << "Insgesamt" << endl;
	cout << "Ordner:  "<< dir << endl;
	cout << "Dateien: "<< file << endl << endl;
}

Übrigens, wenn du eh schon mit cout rummachst, dann versuch gleich std::string zu verwenden, statt mit den char* zu arbeiten. Ist zwar manchmal zum Kotzen hässlich (tschuldigung, aber toupper), aber man erspart sich eine Menge nicht direkt erkennbarer Fehler.
 
Zurück