Dateien (Dateinamen) aus einem Verzeichnis herauslesen
-
Ich habe lange gegooglet und ein Beispiel gefunden, was ich für mich umgeschrieben habe:
AnsiString Pfad = "C:\\Ordner\\" ; WIN32_FIND_DATA anz; HANDLE suche; suche = FindFirstFile(Pfad.c_str(), &anz) ; do { if(anz.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp(anz.cFileName, ".") && strcmp(anz.cFileName,"..")) { AnsiString helpstring = AuftragsPfad + anz.cFileName + "\\" ; suche = FindFirstFile(helpstring.c_str(), &anz); ListBox1->Items->Add(anz.cFileName); } else { ListBox1->Items->Add(anz.cFileName); } } while (FindNextFile(suche, &anz)); FindClose(suche);
Leider gibt mir diese Funktion nicht die Dateien aus, welche in dem angegebenen Ordner enthalten sind!
Ich benutze Windows Vista als Betriebssystem und habe auch in der if-Anweisung && strcmp(anz.cFileName, "." && strcmp(anz.cFileName,"..") weggelassen, was auch nichts brachte.
Ich bekomme dann immer nur komische Buchstaben ausgegeben z.B. ein a mit ~ drüber und ähnliches.
-
Was gibt es am BCB-internen TSearchRec und FindFirst / FindNext auszusetzen?
-
Hast du n kleines Code-Schnipsel dafür? In der BCB-Hilfe finde ich bisher nicht viel ...
Edit: Ich war mal wieder zu blöd zum gucken, habe jetzt doch ein Beispiel gefunden und umgeschrieben:
AnsiString Pfad = ... ; TSearchRec sr; int iAttributes = 0; /* iAttributes |= faReadOnly ; iAttributes |= faHidden ; iAttributes |= faSysFile ; iAttributes |= faVolumeID ; iAttributes |= faDirectory ; iAttributes |= faArchive ; iAttributes |= faAnyFile ;*/ if (FindFirst(Pfad, faAnyFile/*iAttributes*/, sr) == 0) { do { if ((sr.Attr & faAnyFile/*iAttributes*/) == sr.Attr) { ListBox1->Items->Add(sr.Name); } } while (FindNext(sr) == 0); FindClose(sr); }
Leider passiert nichts, wenn ich mit der Funktion einen Pfad durchsuche ... Müssten eigentlich Dateien anzeigen (vorhanden sind sie jedenfalls
)
-
Meines wissens, fehlt dir in der Zeile "AnsiString Pfad = "C:\\Ordner\" ;" nach dem doppelen Slash am Schluss den *, für die Suche aller darin befindlicher Dateien.
Zudem ergeben diese Zeilen für mich keinen sinn.
if(anz.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp(anz.cFileName, ".") && strcmp(anz.cFileName,"..")) { AnsiString helpstring = AuftragsPfad + anz.cFileName + "\\" ; suche = FindFirstFile(helpstring.c_str(), &anz); ListBox1->Items->Add(anz.cFileName); }
- Du gehst hinein, wenn der Ordner "." oder ".." heisst, anstatt diese auszuschliessen.
- Mit Find First würdest du wieder zum beginn zurückkehren. Folgerung, der Else-Part deiner IF-Abfrage würde nie ausgeführt werden, ausser vielleicht im aller letzten Verzeichnis.
- Kann es sein, dass du alle Dateien ab einer gewissen Verzeichnishierarchie auslesen willst (auch die Dateien der verschiedenen Unterordner)?
Dann solltest du dich mal mit der Rekursion auseinandersetzen.
Aus diesem Grund, hier ein funktionierendes Stück Code:
Ich denke, es wäre nicht schlecht, das mal zu Gemüte zu führen.AnsiString sFolderpath; HANDLE hFileHandle; WIN32_FIND_DATA wfd; //Auslesen der Verzeichnisnamens aus der Datei sFolderpath=TXT_SearchPath->Text; //prüfen ob das letzte Zeichen ein \ ist ansonsten wird es hinzugefügt //Das Verzeichnis beginnt immer mit \\* if (sFolderpath.Length()>0) { if (sFolderpath[sFolderpath.Length()]!='\\') sFolderpath+="\\*"; else sFolderpath+="*"; } //Sucht die Erste Datei hFileHandle=FindFirstFile(sFolderpath.c_str(),&wfd); do{ //Prüfung, ob es sich um einen Ordner handelt if (BOOL(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){ //In jedem Verzeichnis gibt es Order mit den namen . und .. diese dürfen nicht aufgelistet werden if (!((wfd.cFileName[0]=='.' && wfd.cFileName[1]=='\0') || (wfd.cFileName[0]=='.' && wfd.cFileName[1]=='.' && wfd.cFileName[2]=='\0'))){ //Der Name wird nun in die Combobox geschrieben CBO_Directory->Items->Add(wfd.cFileName); } } else{ //Datei in die Liste eintragen CBO_Files_Normal->Items->Add(wfd.cFileName); } }while (FindNextFile(hFileHandle,&wfd)); //WICHTIG!!! Das Objekt muss wieder geschlossen werden. FindClose(hFileHandle);
Entschuldige, wenn ich nicht ganz so fest ins Detail gehe (Oben in den Bemerkungen zu deinem geposteten Code).
-
hallo deforation, vielen dank! dein code ist echt flüssig und sehr verständlich!
Dass am Ende des Pfades noch ein "*" hinmuss, wusste ich nicht. Ich hatte auch eigentlich gar nicht vor, auch in Unterordnern zu suchen. Ich hatte die Abfragen mit . und .. auch mal herausgenommen, aber das brachte auch nichts (ich habe erwartungsgemäß eigentlich nur Dateien in meinem Pfad).ich werde das gleich mal austesten!
Edit:
So alles funktioniert super!
Mein zweites Beispiel funktioniert auch, da fehlt genauso der "*" am Ende des Pfades.
Gneauso müsste man hier noch die "." und ".." herausfiltern.Gruß Michel