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
-
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
undFindNextFile
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?
-
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.htmlHier ein Beispiel:
http://doc.trolltech.com/4.6/dialogs-findfiles.htmlfr33g 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 gutGrü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?
-
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.
-
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