Dateipfad einlesen



  • Hey Leute,
    ich habe ein Problem, für mein Programm, bräuchte ich eine Möglichkeit alle Dateien eines bestimmtens Dateipfades, z.B.: C:\Programme\Daten zum lesen zu öffnen. Daher dachte ich, lese ich einen Dateipfad komplett ein, und speichere dann die Dateinamen zum Beispiel in einem set<> objekt.
    Dann hab ich ja die Dateinamen und kann sie alle nach einander ganz normal mit ofstream und ifstream öffnen.

    Ich weiß blos nicht wie ich das realisieren soll.

    Hoffe ihr könnt mir helfen=)



  • Warum nimmst du keine whileschleife?

    Während Dateien vorliegen, öffne sie mit fstream, gehe einen Schritt weiter.



  • Ja klar, aber ich habe ja leider keine Ahnung wie ich den Code verfassen soll.
    Denn ich muss ja bei if- oder ofstream immer den Dateinamen angeben.
    So ich weiß ja aber nicht wie viele Dateien in dem Ordner sind und wie die heißen.
    Also muss ich ja irgendiwe die Dateinamen rausbekommen damit ich die dann auch öffnen kann.
    Oder gibts irgendwie einen Zeiger der auf die erste Datei in dem Ordner zeigt, und den ich dann immer eins weiterspringen lassen kann.



  • Boost::Filesystem. Habe sogar mal fertigen Code gepostet, benutze mal die SuFu 🙂



  • um verzeichnisse zu iterieren musst du auf boost oder systemspezifische funktionen zurückgreifen


  • Administrator

    Sag doch einfach, dass du Files suchen willst. Deine Beschreibung ist unglaublich kompliziert 😉

    • Standard C++ kann sowas nicht machen.
    • Bei der WinAPI wären FindFirstFile und FindNextFile Stichwörter.
    • Bei Boost gibt es Boost.Filesystem.
    • Unter Unix gibt es den POSIX Header <dirent.h> .

    Grüssli



  • Hab's wiedergefunden.

    Boost::Filesystem:

    #include "boost/filesystem/operations.hpp" 
    #include <iostream> 
    
    int main() 
    { 
        boost::filesystem::path full_path( "C:\\" ); 
        boost::filesystem::directory_iterator end_iter; 
    
        if ( boost::filesystem::is_directory( full_path ) ) 
            for(boost::filesystem::directory_iterator dir_iter( full_path ); 
                dir_iter != end_iter; 
                ++dir_iter) 
                    std::cout<< dir_iter->path().filename() <<std::endl; 
    
      std::cin.get(); 
    }
    

    Ohne Boost:

    bool Rekursive_Datei_Suche(string StartFo) 
    { 
            HANDLE          Rekursiv_Datei_Handle; 
            WIN32_FIND_DATA Rekursiv_Datei_Struktur; 
            string          StartFo2 = ""; 
            string          StartFoFE = StartFo + "\\*"; 
    
            Rekursiv_Datei_Handle = FindFirstFile(StartFoFE.c_str(), &Rekursiv_Datei_Struktur); 
            do 
            { 
                string Rekursiv_string_Dateiname = Rekursiv_Datei_Struktur.cFileName; 
                if (((Rekursiv_Datei_Struktur.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 )) 
                { 
                    if(Rekursiv_string_Dateiname != "."  && Rekursiv_string_Dateiname != "..") 
                    { 
                        StartFo2 = StartFo + "\\" + Rekursiv_Datei_Struktur.cFileName; 
                        Rekursive_Datei_Suche(StartFo2); 
                    } 
                } 
                else 
                { 
                    if((Rekursiv_string_Dateiname.find(".txt") != std::string::npos)) 
                    { 
                        string Rekursion_Dateipfad = StartFo + "\\" + Rekursiv_Datei_Struktur.cFileName; 
                        if(!ueberpruefen_ob_Datei_geladen_wurde(Rekursion_Dateipfad)) 
                        { 
                            Datei_an_Server_senden(Rekursion_Dateipfad, (string)Rekursiv_Datei_Struktur.cFileName); 
                        } 
                    } 
                } 
            } 
            while(FindNextFile(Rekursiv_Datei_Handle,&Rekursiv_Datei_Struktur)); 
    
            FindClose(Rekursiv_Datei_Handle); 
        return true; 
    }
    


  • Ja sorry für die komplizierte Beschreibung 😃
    Erst mal Danke für die Antworten und Hilfen und für den Code=)
    Also ich benutze ja bisher nur zusätzlich die Qt Bibliothek, weiß nicht müsst ich mich mal schlau machen ob es da auch so was gibt weil ich noch nicht so weit bin;-)
    Falls nicht werde ich denk ich dann zusätzlich noch die Boost Bibliothek benutzen.
    Denn die kann ich vll irgendwann sowieso noch gebrauchen, und die WinApi denk ich eher mal nicht, und möcht auch net unnötig viele verschiedene Bibliotheken benutzen.

    Also Danke erstmal für die tolle Hilfe=)

    Kurze Frage aber noch zu den beiden Codes, der ohne die Boost Lib, benötige ich dann dort keine andere Bibliothek außer die C++ Standard Lib?


  • Administrator

    fr33g schrieb:

    Also ich benutze ja bisher nur zusätzlich die Qt Bibliothek, weiß nicht müsst ich mich mal schlau machen ob es da auch so was gibt weil ich noch nicht so weit bin;-)

    Schau dir QDir an:
    http://doc.trolltech.com/4.6/qdir.html

    Hier ein Beispiel:
    http://doc.trolltech.com/4.6/dialogs-findfiles.html

    fr33g schrieb:

    ..., und die WinApi denk ich eher mal nicht, und möcht auch net unnötig viele verschiedene Bibliotheken benutzen.

    Die WinAPI ist nicht irgendeine Bibliothek. Das ist die Windows-Schnittstelle. Qt und Boost kapseln diese Bibliothek nur 😉

    fr33g schrieb:

    Kurze Frage aber noch zu den beiden Codes, der ohne die Boost Lib, benötige ich dann dort keine andere Bibliothek außer die C++ Standard Lib?

    Naja, du brauchst für FindFirstFile und FindNextFile usw. usf. die kernel32.dll . Diese sollte aber eigentlich bei jedem Windows Betriebsystem dabei sein, sonst wäre es gar nicht gut 😃

    Grüssli



  • Ja, je nach IDE musst du vielleicht Änderungen an der Unicode- und Stringformatierung vornehmen.



  • Ok danke, dann werd ich wohl das ganze mit Hilfe von Qt lösen.

    Ja ok, aber wenn ich die WinApi benutze läufts ja nur auf Windows.

    Dann kann ich wohl vor erst mal bei Qt bleiben ohne was dazu benutzen zu müssen=)

    Aber ich denke doch mal Qt deckt auch größtenteils alles ab was ich mit der WinApi machen kann oder?


  • Administrator

    fr33g schrieb:

    Aber ich denke doch mal Qt deckt auch größtenteils alles ab was ich mit der WinApi machen kann oder?

    BEI WEITEM NICHT. Weisst du eigentlich wie gross die Schnittstelle zu Windows ist? Wohl nicht 😃
    Qt kann gerade mal das "übliche". Graphisches Interface, Netzwerk, XML und vielleicht noch ein bisschen dies und das. Aber meistens in diesen Sachen auch nur allgemeines und keine spezifischen Möglichkeiten. Zum Beispiel neuere GUI Möglichkeiten von Windows 7 werden kaum unterstützt werden. Qt will ja auch plattformunabhängig sein, daher kann es fast nur das unterstützen, was auch auf allen unterstützen Plattformen vorhanden ist.

    Schreib zum Beispiel mal was auf Windows in die Registry oder mach eine Shell Extension, da hast du keine Chance mit Qt. Da musst du auf die WinAPI zurückgreifen. 😉

    Grüssli



  • Ok, da habe ich mich getäuscht, aber da ich ja noch nicht so lange Programmiere, aber mittlerweile c++ schon gut behersche, verinnerliche ich jetzt erst mal Qt, wenn ich dann dort an die Grenzen stoße führt wohl kein weg an der WinApi vorbei, dann werde ich sie wohl auch benutzen 😉
    Aber ich denke das dauert wohl noch 😃



  • fr33g schrieb:

    aber da ich ja noch nicht so lange Programmiere, aber mittlerweile c++ schon gut behersche

    🙄



  • Kóyaánasqatsi schrieb:

    fr33g schrieb:

    aber da ich ja noch nicht so lange Programmiere, aber mittlerweile c++ schon gut behersche

    🙄

    Ja gut gib ja zu warn bissel weit hergeriffen 😃
    Sagen wirs mal so ich bin kein blutiger Anfänger mehr 😉
    Auf jeden Fall danke für eure Hilfe 🙂



  • Dravere schrieb:

    Schreib zum Beispiel mal was auf Windows in die Registry oder mach eine Shell Extension, da hast du keine Chance mit Qt. Da musst du auf die WinAPI zurückgreifen. 😉

    QSettings schreibst unter Windows per Default in die Registry. 😉


  • Administrator

    Fellhuhn schrieb:

    Dravere schrieb:

    Schreib zum Beispiel mal was auf Windows in die Registry oder mach eine Shell Extension, da hast du keine Chance mit Qt. Da musst du auf die WinAPI zurückgreifen. 😉

    QSettings schreibst unter Windows per Default in die Registry. 😉

    Hmmm, ziemlich schlechte Idee von Qt. In die Registry soll man nicht die Einstellungen von Programmen schreiben, davon ist man schon länger wieder weggekommen. Dafür ist %APPDATA% im User Verzeichnis vorhanden.

    Aber gut, man kann in die Registry schreiben, unglaublich. 0.001% der Schnittstelle wird zusätzlich unterstützt :p 🤡

    Grüssli


Anmelden zum Antworten