Rekursiv Ordner durchsuchen - seltsamer Fehler
-
Hi!
Hab mir ne kleine Methode gebastelt, die eigentlich alle Unterordner und den angegeben Ordner durchsuchen und alle Dateien anzeigen soll, aber dabei tritt ein Fehler auf und es werden nur einige Dateien angezeigt!Zuerst mal die Methode:
scanFolderForFiles("C:/TestOrdner"); bool cSearcher::scanFolderForFiles(TCHAR fileName[1024]){ ofstream ofile; ofile.open("C:/SearchForFiles.txt", ios::app ); WIN32_FIND_DATAA lpData; TCHAR fName[1024]; TCHAR ParamName[1024]; strcpy_s(fName,fileName); strcpy_s(ParamName,fileName); strcat_s(fName,"/*.*"); HANDLE h=FindFirstFile(fName,&lpData); ofile<<"Starte: "<<fName<<endl; do{ if(!((lpData.cFileName[0] == '.') && ((lpData.cFileName[1] == '.' && lpData.cFileName[2] == 0) || lpData.cFileName[1] == 0))){ if(lpData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ strcat_s(ParamName,1024,"/"); strcat_s(ParamName,1024,lpData.cFileName); ofile<<"Search: "<<ParamName<<endl; scanFolderForFiles(ParamName); } else{ sprintf(outer[ind++],"%s/%s",fileName,lpData.cFileName); ofile<<"Datei : "<<outer[ind-1]<<endl; } } }while(FindNextFile(h,&lpData)); ofile.close(); return true; }outer[]=Ein Array das mir am Bildschirm ausgibt was gefunden wurde...
DAS steht in der Log Datei (ofile)
Starte: C:/Testordner/*.* Search: C:/Testordner/1a Starte: C:/Testordner/1a/*.* Datei : C:/Testordner/1a/Datei1a.bmp Search: C:/Testordner/1a/1b Starte: C:/Testordner/1a/1b/*.* Datei : C:/Testordner/1a/1b/Datei1a.bmp Search: C:/Testordner/1a/1b/1c Starte: C:/Testordner/1a/1b/1c/*.* Datei : C:/Testordner/1a/1b/1c/Datei1a.bmp Datei : C:/Testordner/Datei1.jpg Datei : C:/Testordner/Datei2.jpg Datei : C:/Testordner/Datei3.jpg Datei : C:/Testordner/Datei4.bmp Datei : C:/Testordner/Datei5.bmpWie zu sehen ist, hängt er immer die Unterordnernamen an die alten dran, was ja nicht schlecht wäre wenn er sie nicht falsch aneinander Reihen würde
Folgende Order und Dateien sind im Testordner
++++++++++++++++++++++++++++ TestOrdner ++++++++++++++++++++++++++| | | ||++1a ++| |+++++++++ 1b +++++++| |++++1c ++++| Datei1| ||Datei1a| | |+++2b++| Datei1b | ||+++2c +++|| Datei2| | | |Datei1b| Datei2b | |||++3c ++||| Datei3| | | |Datei2b| Datei2b | |||Datei1c||| Datei4| | | |Datei3b| | |||Datei2c||| Datei5| | | |Datei4b| | | | |Seht ihr da irgendwo den Fehler?
Ich suche seid ner Stunde aber ich bin auch schon ziemlich müde also *g*MfG
-
Mit dem Code ist soviel Falsch, ich weiss garnicht wo ich anfangen soll.
Erstmal die Formatierung ist ein GRAUS. Nach nem Komma sollte man ein Space schreiben, zwischen einem binären Operator und seinen Argumenten ebebso, etcpp.Nun zu den "echten" Fehlern:
- du verwendest TCHAT zusammen mit strcpy_s -- strcpy_s arbeitet mit char, TCHAR kann aber char oder wchar_t sein. Entweder alles mit TCHAR (strcpy_s -> _tcscpy_s), oder alles char (TCHAR -> char).
- was ist "outer"?
- Wenn du auf mehrere Unterverzeichnisse im selben Verzeichnis stösst dann hängst du munter weiter Strings hinten an "ParamName" an, ohne "ParamName" neu zu initialisieren. Pack das "strcpy_s(ParamName,fileName);" mit in das "if" rein (als erste Zeile), dann funktioniert die Schleife auch.
- Du öffnest "ofile" in jedem Schritt der Rekursion? Ich bin mir jetzt nicht sicher, aber ich nehme an dass dir dadurch Daten überschreibst - wieso gibst du den stream nicht als Referenz mit? Du kannst ja einfach 2 Funktionen machen, eine öffnet den Stream selbst, und eine nimmt ihn als Parameter. Beide rufen dann die Funktion auf die den Stream als Parameter nimmt.
- Du schreibst ein komplett Windows spezifisches Programm, verwendest dann aber "/" als Trennzeichen anstatt "\" (was zwar unter Windows auch geht, aber irgendwie komisch ist).
-
2.) outer hab ich eh schon im ersten beitrag beschrieben!
3.) Danke das war der Fehler! Super jetzt funktionierts!- Du schreibst ein komplett Windows spezifisches Programm, verwendest dann aber "/" als Trennzeichen anstatt "\" (was zwar unter Windows auch geht, aber irgendwie komisch ist).
Ich hab früher alles mit \\ bzw \ geschrieben, allerdings gabs da meistens probleme, seid dem hab ich nur noch / verwendet.
Danke nochmal für die Hilfe!