FindFirst/Next -> Unterverzeichnisse
-
Hallo,
bevor ich gar durchdrehe, frage ich lieber mal nach.
Ich will in einem Verzeichnis die Unterverzeichnisse auflisten ...
TSearchRec sr; TStringList *list = new TStringList; string strMask = "c:\\test\\*.*"; if( FindFirst( strMask.c_str(), faDirectory, sr ) == 0 ) { list->Add( sr.Name ); while( FindNext( sr ) == 0 ) list->Add( sr.Name ); }
Was mache ich falsch?
Danke!
-
Original erstellt von <Gast>:
Was mache ich falsch?Du hast a) nicht in der FAQ nachgesehen (unter Dateien+Verzeichnisse) und du hast b) vergessen, mitzuteilen, was eigentlich das Problem/der Fehler bei deinem Beispiel ist.
-
Hallo Jansen
a) Doch, hab ich. FAQ und Suchfunktion und BCB-Hilfe. Aber alles was ich ausprobiert habe, hat nicht funktioniert. Falls ich die richtige Lösung übersehen habe, bitte stoß mich mit der Nase drauf!
b) Ich bekomme immer die Dateien auch mit. Auch ein nachträgliches Abfragen der Attribute hat mich nicht weitergebracht.
if( ( sr.Attr & faDirectory ) > 0 ) { // ist ein Verzeichnis }
Ich brauche zwei Listen, einmal alle "normalen" Dateien (1), und dann eben die Unterverzeichnisse (2). Wenn ich in meinem obigen Code faDirectory durch 0 ersetze, habe ich (1). Mit faDirectory bekomme ich die Verzeichnisse zusätzlich, aber eben nicht ausschließlich. Das zusätzlich würde ich aber bei 0 | faDirectory erwarten ...
Danke für Deine Hilfe
-
Pribier mal:
. . if (FindFirst( strMask.c_str(), faDirectory, sr ) == 0 ) { do { if ((sr.Attr & faDirectory) ==faDirectory) list->Add( sr.Name ); //else // listFile->Add(sr.Name);//zweite Liste fuer Dateien } while( FindNext( sr ) == 0 ); FindClose(sr); } . .
-
Nein, bringt leider auch nichts.
Auf sr.Attr steht immer der beim Aufruf von FindFirst() übergebene Wert.
-
Das MUSS gehen (mach das seit Jahren so!)
Poste mal Deinen jetzigen genauen Stand des Programm- Teils!!!
PS: Hab BCB 4.0 (Ist aber egal)
[ Dieser Beitrag wurde am 06.03.2003 um 11:38 Uhr von DerAltenburger editiert. ]
PS: Du musst 'ne do .. while- Schleife machen!!!
[ Dieser Beitrag wurde am 06.03.2003 um 11:48 Uhr von DerAltenburger editiert. ]
-
Hallo Altenburger,
habe Deinen Code übernommen -> läuft.
VIELEN DANK !!
Mich hat irritiert, daß bei faDirectory auch die normalen Dateien mitkommen. Aber das ist wohl in FindFirst/FindNext so gemacht. Also bedeutet faDirectory nicht "Verzeichnisse liefern" sondern "Verzeichnisse AUCH mitliefern".
Dann habe ich sr.Attr ausgewertet, und zwar erst hinter dem FindFirst/FindNext-Konstrukt in einer Schleife über die StringList. Das war natürlich Blödsinn, weil ich damit ja nicht mehr das zum jeweiligen sr.Name gehörende sr.Attr geprüft habe, sondern immer das des letzten FindNext-Aufrufs. Das war mein Fehler.
Hier zur Erklärung mal der falsche (!!!) Code ...
if( FindFirst( strMask.c_str(), faDirectory, sr ) == 0 ) { list->Add( sr.Name ); while( FindNext( sr ) == 0 ) list->Add( sr.Name ); } for( int i = 0; i < list->Count; i++ ) { if( ( sr.Attr & faDirectory ) == faDirectory ) ... // Verzeichnis else ... // Datei }
Richtig muß die Auswertung von sr.Attr in die FindFirst/FindNext-Geschichte mit rein (Dein Code).
Das mißverstandene Verhalten von FindFirst/FindNext bezügl. faDirectory hat mich völlig auf die falsche Fährte gebracht.Vielen herzlichen Dank nochmal !
-
Original erstellt von <Gast>:
Richtig muß die Auswertung von sr.Attr in die FindFirst/FindNext-Geschichte mit reinUnd genauso steht's in den FAQ-Beispielen, die dir ja angeblich nicht helfen konnten ...