Alle Dateien von C: auflisten...
-
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
-
hmm.. was für ein Fehler ?! das sollte man immer dazu sagen...
-
Was muss man ändern dass z.b. oben fest "Scanning..." steht und da drunter auf der zeile jedesmal dann die datei:
Scanning... c:\test.txtSo jetzt auf der zeile wo die datei ausgegeben wird sollen auch die anderen ausgegeben werden und jedesmal neu ausgegeben werden
-
Ich hab versucht jede Datei zu zählen dabei habe ich eine globale Variable verwendet, aber irgendwie kommen da zahlen raus mit größeren abständen:
int i = 0; //Global string ListDirectory(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 { i++; string anzahl =intStr(i); //Int nach String if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) { // Verzeichnis... if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { ScanDir = str + wfd.cFileName; newDir += ListDirectory(ScanDir); back = anzahl + " " + newDir; } // Dateien... else { ScanFile =str + wfd.cFileName; back += anzahl + " " + ScanFile + leer; } } }while (FindNextFile(fHandle,&wfd)); FindClose(fHandle); return back; }
-
Da sollten keine Abstände drin sein. Aber bei deiner Vorgehensweise werden die Verzeichnisse mitgezählt, und die Zahlen stehen nicht in aufsteigender Reihenfolge im Text.
Vielleicht vollziehst du deinen Algorithmus einfach mal auf dem Papier nach, dann sollte dir das klar werden.
-
Das mit den Abständen ist ja nicht schlimm da die zahl vor der datei steht.
Habs bißchen geändert aber bringt nichts da bei mehreren unterordner ganz was anderes rauskommt// Verzeichnis... if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { ScanDir = str + "\\" + wfd.cFileName; newDir += ListDirectory(ScanDir); back = newDir; } // Dateien... else { i++; string anzahl = intStr(i); ScanFile = str + "\\" + wfd.cFileName; back += anzahl + " " + ScanFile + leer; }Sobald sich in einem Verzeichniss mehrere Dateien befinden, zeigt das programm nur diese an, dabei werden die restlichen unterordner nicht mehr durchsucht.
z.B.
c:\test\A\B\C
Im Ordner A sind Dateien dann werden diese ausgegeben und das prog schließt, was muss machen das er weiter sucht?