Verzeichnisse auflisten



  • Hallo,
    ich versuche alle verzeichnisse in einem in einem bestimmten Pfad aufzulisten und diese in einem vector zu lagern. Hier ist erstmal der code dafür:

    vector<char*> cSubDirs;
        HANDLE hFile;
        _WIN32_FIND_DATAA findData;
        hFile = FindFirstFile(string(currentPath + "*").c_str(), &findData);
        cout << currentPath << findData.cFileName << endl;
    
        while(FindNextFile(hFile, &findData))
        {
            if(findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
                cSubDirs.push_back(findData.cFileName);  
    
            cout << currentPath << findData.cFileName << endl;
        }
    
        cout << endl << "[DEBUG] - cSubDirs:" << endl;
        for(int i = 0; i < cSubDirs.size(); i++)
        {
            cout << '\t' << i << '\t' << cSubDirs[i] << endl;
            cSubDirs.pop_back();
        }
    

    currentPath beinhaltet "C:/". Damit kann ich auch schon alle Dateien und Verzeichnisse die bei mir auf C liegen auflisten, aber wenn ich dann den cSubDir vector durchlaufe, zeigt er mir für jedes eingetragene element "Windows" an.
    Ich versteh nur nicht warum, bzw was ich falsch gemacht hab...



  • Du speicherst in Deinem Vektor nur Zeiger, die am Ende nicht mehr dahin zeigen, wo Du glaubst.
    Speicher lieber direkt den ganzen Namen:
    vector<string> cSubDirs;

    Edit:
    Außerdem gibst Du in der Schleife

    for(int i = 0; i < cSubDirs.size(); i++)
        {
            cout << '\t' << i << '\t' << cSubDirs[i] << endl;
            cSubDirs.pop_back();
        }
    

    den Vektorinhalt von vorne nach hinten aus, aber nach jeder Ausgabe löschst Du ein Element vom Vektorende?!



  • Ah, vielen dank. das mit pop_back ist mir auch schon aufgefallen. Hatte vorher stack statt vector, ist aber auch schon raus. Aber das mit string statt char* functioniert schonmal besser. Ich bekomme nun verschiedene Verzeichnisse aufgelistet, jedoch nicht alle. Woran kann das liegen?



  • Ändere mal die Bedingung:
    if(findData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)

    in

    if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)



  • Hey, cool, funktioniert.
    Hab jetzt allerdings noch zwei Fragen:

    1. Was bedeutet das & in diesem Fall (ein Stichwort reicht mir, dann google ich das selber).

    2. Es werden auch Ordner aufgelistet die bei mir im Explorer nicht angezeigt werden ( und ich mein jetzt nicht die versteckten Ordner). Als beispiel sind da boot und system volume information, ... Ist das normal und wenn ja, warum werden die dann vom Explorer nicht angezeigt?



  • 1: Bitoperator UND
    2. Ja, wo bei system volume information ein versteckter ordner ist... boot kenne ich nicht.



  • Wie kann ich so einen Ordner anlegen, sodass er nicht im Explorer angezeig wird. Mit dem dir command in der Konsole werden die Ordner auch nicht angezeigt. Trotzdem komme ich über cd dort rein



  • Im Explorer rechte Maustaste auf dem Ordner, 'Eigenschaften' auswählen und unten 'versteckt' markieren.



  • Nein, das meine ich nicht. Ich nehme als beispiel mal den "boot" Ordner. Dieser wird mir über FindNextFile() angezeigt, das er existiert. Über den Explorer kann ich den jedoch nicht sehen, obwohl ich verstekte ordner anzeigen angewählt hab. Andere versteckte Ordner werden bei mir auch im Explorer angezeigt. Der einzige weg, wie ich also in den Ordner komme läuft über die Komandozeile via cd

    cd c:/boot
    

    und wenn ich in diesem Ordner bin, wird mir über dir auch angezeigt, dass da noch andere Ordner und Dateien sind.

    Mich interessiert nun, wie ich so einen Ordner anlegen kann, bzw wie sowas möglich ist. Das mit "Eigenschaften" -> "Verstekt" ist mir bekannt, jedoch wird der Ordner dann trotzdem im Explorer angezeigt.



  • Die Ordner "Boot" sowie auch "System Volume Information" sind versteckt und Systemordner



  • Ah, okay, jetzt hab ich es auch. Brauchte ein bisschen länger 😃
    Danke an alle für die Hilfe 😉


Anmelden zum Antworten