Alle Dateien von C: auflisten...
-
Hab mir mal den Beispiel Code vom Forum angeguckt:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39396.htmlWas müsste man ändern, dass man wirklich alle Dateien auflisten kann, also alle Verzeichnisse, Unterordner...
Am Ende müsste die gleiche Anzahl von Dateien stehen wie bei der Eigenschaft von C:
-
procedure dir_list ( root : string ) while weitere datei in root gefunden if dateityp = verzeichnis then dir_list(datei) else out datei in root gefunden end procedureDen Rest solltest du dir aus dem Thread rauspicken können.
MfG SideWinder
-
Du müsstest mit GetFileAttribute überprüfen, ob das aktuelle Element ein Verzeichnis ist. Falls ja, musst du in dieses Verzeichnis wechseln und dort wieder alle Dateien und Verzeichnisse auflisten.
Das lässt sich am besten mit einer rekursiven Funktion erreichen, die einen Pfad als Parameter erwartet, dessen Dateien sie zählt. Und wenn du in der Funktion ein Verzeichnis findest, rufst du sie selbst nochmal mit dem neuen Pfad auf.
-
masterofx32 schrieb:
Du müsstest mit GetFileAttribute überprüfen, ob das aktuelle Element ein Verzeichnis ist. Falls ja, musst du in dieses Verzeichnis wechseln und dort wieder alle Dateien und Verzeichnisse auflisten.
Das lässt sich am besten mit einer rekursiven Funktion erreichen, die einen Pfad als Parameter erwartet, dessen Dateien sie zählt. Und wenn du in der Funktion ein Verzeichnis findest, rufst du sie selbst nochmal mit dem neuen Pfad auf.In WIN32_FIND_DATA findest du bereits ob das Verzeichnis ein Directory ist, GetFileAttribute() brauchst du gar nicht.
MfG SideWinder
-
Sobald die laufende Funktion ein Verzeichniss erkennt, soll die Funktion wieder aufgerufen werden und als Parameter das aktuelle Verzeichniss dursuchen. Hab aber ein Fehler sobald die laufende Funktion sich selbst nochmal starten soll. Das hab ich zusammengestelt:
string scan(string str) { HANDLE fHandle; WIN32_FIND_DATA wfd; string Dir = str + "\\*"; fHandle=FindFirstFile(Dir.c_str(),&wfd); string verzeichnis; string leer = "\n"; string tab = " "; do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //Verzeichnis... scan(wfd.cAlternateFileName); // Hier liegt der Fehler! verzeichnis += wfd.cFileName + tab + leer; } else { //Dateien... //verzeichnis += wfd.cFileName + tab + leer; } //verzeichnis += wfd.cFileName + tab + leer; } }while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); return verzeichnis; }
-
Du musst dir mit str wieder den kompletten Pfad zusammenbasteln...
-
Wie kann ich am besten in der if Schleife das aktuelle Verzeichnis auslesen und weiterverarbeiten:
verzeichnis = "C:\\" + wfd.cFileName; scan(verzeichnis);So jetzt will ich nicht jedesmal den pfad angeben wie oben, es soll automatisch rausfinden in welchem verzeichnis es sich nun befindet
-
Du hast du in str den Verzeichnis-Pfad bis zur aktuellen Ebene drin - da musst du dann einfach noch wfd.cFileName anhängen...
-
Habs hinbekommen mit den Verzeichnissen, aber jetzt hab ich ein anderes Problem:
string scan(string str) { HANDLE fHandle; WIN32_FIND_DATA wfd; string Dir = str + "\\" + "*"; fHandle=FindFirstFile(Dir.c_str(),&wfd); string leer = "\n"; string slash = "\\"; string ScanDir; string ScanFile; string back; //Rückgabewert do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //Verzeichnis... ScanDir = str + "\\" + wfd.cFileName; scan(ScanDir); } else { //Dateien... ScanFile = str + "\\" + wfd.cFileName; //cout << ScanFile << endl; //scan(ScanFile); } back = ScanFile; //cout << back << endl; return back; } }while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); return back; }Wenn ich back ausgebe mit cout dann werden alle verzeichnisse + file ausgegeben, aber ich möchte das back zurückgegeben wird aber es passiert nichts wenn ich die funktion mit cout << scan("c:\"); ausgebe. HILFE
-
kernel64 schrieb:
es passiert nichts wenn ich die funktion mit cout << scan("c:\"); ausgebe. HILFE
Was soll denn da passieren?
-
MFK schrieb:
Was soll denn da passieren?
Es soll sowas zurückgegeben werden:
c:\\Windows\
c:\\Windows\test.txt
...Also alle Dateien mit Datein mit dem Pfad in einem String, aber das müsste normalerweise funktionieren da back jedesmal ein neuen string mit der datei erhält und zurückgibt. Es wird nix ausgegeben wenn ich back zurückgebe aber wenn ich direkt back in der funktion ausgebe dann gehts.
Info: Die return Anweisung in der Schleife muss raus (return back)
-
kernel64 schrieb:
Es wird nix ausgegeben wenn ich back zurückgebe aber wenn ich direkt back in der funktion ausgebe dann gehts.
Logisch. Du überschreibst den Inhalt ja immer wieder mit dem aktuellen Dateinamen.
Wenn du die Namen sammeln willst, musst du nicht ersetzen, sondern anhängen.
-
stimmt das war mein Problem THX jetzt gehts

-
Ich hab mich doch wohl zu gefreut, ich hatte ja noch cout in der funktion und die hat alles ausgegeben, so wie mach ich das jetzt langsam verliere ich aber die Geduld. Jetzt hab ich:
back += ScanFile + leer;in die else schleife eingefügt. Wenn ich funktion ausführe dann wird nix ausgegeben aber auf die festplatte wird zugegriffen
Bitte um Hilfe
-
Den Rückgabewert des rekursiven Aufrufs musst du auch noch anhängen.
-
Wieso werden hiermit einige dateien doppelt aufgezählt?
Kannste bitte überprüfen ob die funktion richtig ist und ob die ausgaben korrekt sind. Wieso sind zwischen zeilen so große abstände?
string scan(string str) { HANDLE fHandle; WIN32_FIND_DATA wfd; string Dir = str + "\\" + "*"; fHandle=FindFirstFile(Dir.c_str(),&wfd); string leer = "\n"; string slash = "\\"; string ScanDir; string ScanFile; string newDir; string back; //Rückgabewert do { if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //Verzeichnis... ScanDir = str + "\\" + wfd.cFileName; newDir += scan(ScanDir); back += newDir + leer; } else { //Dateien... ScanFile = str + "\\" + wfd.cFileName; back += ScanFile + leer; } // back += ScanFile + leer; // cout << "back: " << back; } }while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); return back; }
-
Zwei Fehler: Du prüfst den Rückgabewert von FindFirstFile nicht. Wenn du da INVALID_HANDLE_VALUE bekommst, brauchst du auch nicht weitersuchen.
Außerdem hängst du nicht nur an back, sondern auch an newDir an. Wenn du also Unverzeichnisse durchsuchst, hängst du den Inhalt des 1. Unterverzeichnisses an, dann den Inhalt des 1. und des 2., dann den Inhalt des 1., 2. und 3. usw. Dadurch sind alle bis auf das letzte Unterverzeichnis mehrfach enthalten. Du darfst hier also nicht an newDir anhängen, sondern nur zuweisen.
-
So jetzt hab alles ich verbessert, wenn ich aber in der main die funktion aufrufe dann wird so lange nix ausgegeben bis alle verzeichnisse im string gespeichert sind, aber ich möchte gerne das die aktuellen verzeichnisse noch ausgegeben werden wie z.B:
Asugabe:
Scanning: c:\\test.txt
Das zweiter problem wie kann ich die ausgabe mit auf der gleichen zeile ausgeben denn mit "\r" gehts nicht.
-
hmm pack halt:
// ... if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //Verzeichnis... ScanDir = str + "\\" + wfd.cFileName; cout << "Scanning " << ScanDir; // sollte doch reichen... newDir += scan(ScanDir); back += newDir + leer; } // ...
-
Am liebsten hätte ich die ausgabe so das scanning immer vorn ist und das immer auf der gleichen zeile dann die datei steht, also es soll nur eine Zeile verwendet werden. Habs damit probiert:
printf("Scanning: "); printf("%s \r", ScanFile);aber dabei gibts ein fehler