Verzeichnisinhalt auslesen



  • Hallo Leute,

    ich kämpfe hier gerade mit dem Problem, dass ich alle Dateien in einem Verzeichnis auflisten möchte, finde jedoch keine so richtige Lösung. Sehr gut lesbar und auch nachvollziehbar finde ich folgenden Quelltext:

    std::dir dir("./");
    
    std::vector<std::string> ret = dir.getEntries();
    for(int i=0; i < ret.size(); i++)
    {
        std::cout << ret[i] << std::endl;
    }
    

    Hierbei wird jedoch von Kompiler die Meldung ausgegeben: 'dir': Ist kein Element von 'std'.

    Ich entwickel unter Windows XP mit Visual Studio Express 2008.

    Gruß
    rodgerwilco



  • Moin,

    array<String^>^ files = System::IO::Directory(".");
    for(int i = 0; i < files->Lenght; i++) Console::WriteLine(files[i]);
    

    hand, mogel

    PS: nicht getestet ... könnte teilweise in Mischung mit Java sein 😃



  • Danke für deine Antwort. Ich habe den Quelltext etwas modifiziert auf

    vector <std::string> files = System::IO::Directory("."); 
        for(int i = 0; i < files.size(); i++){
            cout << files[i] << endl;
        }
    

    Allerdings meckert der Kompiler immer noch rum.:
    - error C2653: 'System': Keine Klasse oder Namespace
    - error C3861: "Directory": Bezeichner wurde nicht gefunden.

    Bin etwas ratlos.

    Gruß
    rodgerwilco



  • kann das sein das Du C++ und nicht C++/CLI machst ??



  • Naja, da ich C++ unter Visual Studio Express schreibe, dachte ich, dass dies mit .NET und damit C++/CLI wäre. Scheint ja nicht so zu sein.



  • rodgerwilco schrieb:

    Naja, da ich C++ unter Visual Studio Express schreibe, dachte ich, dass dies mit .NET und damit C++/CLI wäre. Scheint ja nicht so zu sein.

    Da bist du nicht allein :r



  • Und was möchtest Du nun?
    C++ oder C++/CLI?

    Simon



  • Ich formulier es mal so: Ich bräuchte eine Lösung, die unter Visual Studio Express 2008 lauffähig ist.
    Jetzt sagt aber bitte nicht, dass man damit beides machten könnte, wenn man wollte. Da sich das Ganze in meinen bestehenden Quelltext einfügen sollte und ich ja scheinbar kein C++/CLI mache, wäre eine C++-Lösung wünschenswert.

    Gruß
    rodgerwilco



  • rodgerwilco schrieb:

    ich ja scheinbar kein C++/CLI mache, wäre eine C++-Lösung wünschenswert.

    *g* Doch C++/CLI ist dabei.. jedoch auch C++.

    vector <std::string> files = System::IO::Directory("."); 
        for(int i = 0; i < files.size(); i++){ 
            cout << files[i] << endl; 
        }
    

    std::vector ist C++
    std::string ist C++
    System::IO::Directory ist C++/CLI, .NET
    std::cout ist C++

    Der Ansatz die Sprache zu wählen, in dem dein restlicher Quelltext ist, ist gut.

    Falls das C++ ist, kommst Du im die WINAPI oder eine andere Library (z.B. boost) nicht drumrum.

    Für die WINAPI Lösung benötigst Du FindFirstFile(..) / FindNextFile(..) / FindClose(..).

    Für eine Lösung mit boost wäre da boost::filesystem zu benutzen.

    Hier noch eine Lösung mit C++/CLI, .NET:

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::IO;
    using namespace System::Collections::Generic;
    
    int main(array<System::String ^> ^args)
    {
    	List<String^> fileNames = Directory::GetFiles(L"C:\\");
    	for each(String^ fileName in fileNames)
    	{
    		Console::WriteLine(fileName);
    	}    
        return 0;
    }
    


  • OK, ich hab jetzt soweit was vorzeigbares - geht zwar in eine andere Richtung, aber es läuft soweit.

    WIN32_FIND_DATA FindFileData;
    	HANDLE hFind;
    	hFind=FindFirstFile (L".\\*",&FindFileData); 
    
    	if (hFind == INVALID_HANDLE_VALUE) 
    	{
    		printf ("FindFirstFile failed (%d)\n", GetLastError());
    	} 
    	else 
    	{
    		do
    		{
    			cout << FindFileData.cFileName << " gefunden." << endl;
    		} while (FindNextFile(hFind, &FindFileData));
    		FindClose(hFind);
    	}
    

    Nur ein Problem bleibt übrig.

    cout << TEXT(FindFileData.cFileName) << " gefunden." << endl;
    

    schreibt nur Speicheradressen heraus. In diesem Feld der Struktur stehen die ASCII-Werte der einzelnen Buchstaben des Datei/Verzeichnis-Namens. Das müsste jetzt noch in einen String konvertiert werden und ich wäre glücklich.

    Gruß
    rodgerwilco



  • Das ist gut.
    Ev. musst Du noch einbauen, dass dein Verzeichnis rekusiv durchsucht wird.

    Mach einfach:

    wcout << FindFileData.cFileName << " gefunden." << endl;
    

    oder um in einen String zu konvertieren:

    std::wstring fileName(FindFileData.cFileName);
    

    Simon



  • Super, das funktioniert alles. Aber beim weiteren Programmieren ist mr der Unterschied zwischen wstring und string aufgefallen, der sich jetzt als Problem rausstellt. Ich hatte schon versucht über

    while ((char) FindFileData .cFileName [iZaehlerDateiname] != 0){
    				strDateiNameAusVerzeichnis = (char) FindFileData .cFileName [iZaehlerDateiname];
    				iZaehlerDateiname++;
    			}
    

    die ASCII-Codes in "lesbare" Zeichen umzuwandeln, aber das geht so wohl nicht.



  • Du hast drei Möglichkeiten:

    1. Project Settings auf Multibyte (od. kein Charset) stellen und std::string (ascii) benutzen
    2. Project Settings auf Unicode stellen und std::wstring (wide) benutzen
    3. Beim Benutzen von API Funktionen nach TCHAR* konvertieren.

    Bei Dir würde ich einfach sagen, probiers doch mal mit Variante 1.
    (Dann aber std::string und std::cout benutzen.)

    Simon


Anmelden zum Antworten