Verzeichnissnamen einlesen

Supa

Erfahrenes Mitglied
Hy...

Gibts ne Möglichkeit, Verzeichnis-/ Unterverzeichnisnamen einzulesen?

Also, nehmen wir mal an, da wären 'n paar Verzeichnisse mit Unterverzeichnissen auf meiner Platte. z.B. wie folgt:

C:\a\
C:\a\aa
C:\a\ab
C:\a\ac

C:\b\
C:\b\ba
C:\b\bb

C:\c\
C:\c\ca

Ich möchte jetzt quasi einfach nur deren Namen (aa,ab,ac,ba,bb,ca) in nem String-Array aufgelistet haben. Allerdings sind mir die Namen der Verzeichnisse vorher nicht bekannt, ich weis nur, das die sich auf C:\ befinden.

Hat jemand ne Idee bzw. 'n paar Funktionen/Stichwörten/Lösungsansätze, die ihm dazu einfallen?

Gruß Supa
 
n'abend

es gibt die Möglichkeit den Inhalt eines Verzeichnisses auszulesen. Durch eine Attributenprüfung kann man auch herausfinden, was eine Datei bzw. ein Verzeichnis ist.
Such mal in der MSDN nach den Funktionen "FindFirstFile" und "FindNextFile". Damit kannst Du den Inhalt auslesen und überprüfen, ob es ein Verzeichnis ist oder nicht. Allerdings musst jetzt durch jedes Verzeichnis weiter durchlaufen, bis Du alle Verzeichnisse gefunden hast.

mfg
 
so, endlich hab ich mal wieder zeit mich mit dem thema auseinander zu setzen.

FindFirstFile und FindNextFile sind ja schonmal ein guter ansatz, ich bekomm auch alle verzeichnissen UND dateien eingelesen. nun haperts nur noch bei der attributprüfung mit GetFileAttributes(). ich überprüf z.b.
Code:
if(GetFileAttributes("c:\\test"))==FILE_ATTRIBUTE_DIRECTORY)
c:\test ist ein verzeichniss. und die if-anweisung von oben ergibt true! wenn bei diesem verzeichniss jetdoch andere flags gesetzt sind, wie z.b. das archiv flag, dann erkennt meine if-anweisung der verzeichniss nichtmehr als solches, sondern nur noch als archiv!

jetzt kann ich die konstanten natürlich noch verküpfen:
Code:
if(GetFileAttributes("c:\\test"))==FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIV)
problem jetzt ist, dass zwar mein verzeichniss c:\test (mit gesetzem archiv flag) erkannt wird, allerdings auch alle dateien, die dieses flag gesetzt haben!

versteht ihr das problem?

ich möchte quasi NUR verzeichnisse ausgegeben bekommen! und so ein verzeichniss kann natürlich kein flags, archiv flag, readonly flag, system flag und/oder hidden flag gesetzt haben!

habs auch schon mit FindFirst und FindNext versucht. da gibt es ähnliche konstanten, aber im endeffekt das selbe problem...

hab auch noch was von CFindFile oder so gelesen und in diesem zusammenhang ne funktion IsDirectory() entdeckt. allerdings konnte ich diese bisher irgendwie nicht in mein programm einbinden geschweigedenn ausprobieren. warscheinlich fehlt mir die richtige header datei.

hat jemand ne idee?
 
Hi.

Das Attribut solltest du nicht vergleichen sondern mit einer Bitmaske vernknüpfen:
Code:
if(GetFileAttributes("c:\\test")) & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIV))

Das heißt die Bedingung wird nur wahr (also ein anderer Wert als 0) wenn die Bits FILE_ATTRIBUTE_DIRECTORY oder FILE_ATTRIBUTE_ARCHIV des Attributs gesetzt sind.

Bei deinem Code hast du geprüft ob auch wirklich nur ein einziges Bit im Attribut gesetzt ist.

Gruß
 
hmm...

ja gut, aber deine lösung bringt leider auch nicht den gehofften erfolg!

wenn ich das so mache, wie du sagtest, dann bekomm ich zwar sämtliche verzeichnisse ausgegeben, aber auch dateien bei denen das archiv flag gesetzt ist!
 
Ja, genau das hab ich doch gesagt, oder?!

Code:
attr = GetFileAtrributes (file_name);

if ((attr & FILE_ATTRIBUTE_DIRECTORY) &&
    (attr & FILE_ATTRIBUTE_ARCHIV))
  ...

Gruß
 
ich glaub, wir reden aneinander vorbei!

ich möchte NUR verzeichnisse ausgegeben bekommen! KEINE dateien like: "test.txt"

und wenn ich das so mache wie du beschrieben hast, werden zwar alle verzeichnisse ausgegeben, aber AUCH dateien bei denen das archiv flag gesetzt ist!
 
aaaahhhhhh.... jetzt hab ich was gefunden:

Code:
if(flData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

im groben und ganzen siehts jetzt wie folgt aus:

Code:
   String root = "c:\\test";

   WIN32_FIND_DATA flData;
   HANDLE hFind = FindFirstFile((root+"\\"+"*").c_str(), &flData);
   BOOL bOK = hFind != INVALID_HANDLE_VALUE;

   while (bOK)
   {
     if(flData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
     {hier stehen die anweisungen zum speichern des verzeichniss namen: flData.cFileName}
     bOK = FindNextFile(hFind, &flData);
   }

fettes mercy an alle, die sich sich hier bemüht haben mir zu helfen!
 
Zuletzt bearbeitet:
Supa hat gesagt.:
ich glaub, wir reden aneinander vorbei!

ich möchte NUR verzeichnisse ausgegeben bekommen! KEINE dateien like: "test.txt"

und wenn ich das so mache wie du beschrieben hast, werden zwar alle verzeichnisse ausgegeben, aber AUCH dateien bei denen das archiv flag gesetzt ist!
Nein, es werden nur Verzeichnisse bei denen das Archiv Flag gesetzt ist ausgegeben (falls es solche überhaupt gibt).

Aber da dein Problem anscheinend gelöst ist, markier doch einfach das Thema als erledigt.

Gruß
 
Zurück