Datei mit unbekanntem Namen öffnen
-
Moin!
Ich möchte mit C++ ein Programm schreiben, das eine Datei in dem selben Verzeichnis, wie das Programm selber liegt, öffnen kann. Allerdings kenne ich den Namen der Datei vorher nicht...
Ein Programm zu schreiben, welches eine Datei mit bekannten Namen öffnet, ist kein Problem...ich müßte also irgendwie das Verzeichnis überprüfen, ob eine/mehrere Dateien existieren und dann den Namen davon einlesen, um sie dann zu öffnen.
Hat jemand eine Idee, wie ich das anstellen könnte??
Bin noch ziemlich am Anfang mit meinen Programmierkenntnissen...
Vielen Dank im Voraus!
-
Schau mal hier:
http://fara.cs.uni-potsdam.de/~kaufmann/progs/dirstream.zip
Generell bist Du auf Betriebssystemspezifische Funktionalitäten angewiesen.
FindFirst
_findfirstSo im groben müsstest Du was finden können.
Welches OS und wechen Compiler verwendest Du ?
-
So...nach einiger Mühe hat es jetzt doch geklappt...er wollte die dirstream erst nicht einbinden, aber jetzt ging es doch...
Ich denke damit komme ich dann schon klar...vielen Dank!!!! Sollte ich noch Fragen haben, stelle ich sie natürlich;)
Ach: Ist das jetzt OS unabhängig? Kommt das nicht darauf an, unter welchem Betriebssystem ich die cpp kompiliere? Ich schreibe das Prog nämlich unter Win, aber es soll später und Linux laufen...wenn die cpp dann unter Linux kompiliert, müßte es doch eigentlich trotzdem funktionieren, oder???
-
Knuddelbaer schrieb:
Generell bist Du auf Betriebssystemspezifische Funktionalitäten angewiesen
Bruder_S schrieb:
Ach: Ist das jetzt OS unabhängig? Kommt das nicht darauf an, unter welchem Betriebssystem ich die cpp kompiliere?
Nein, du bist auf eine Betriebssytem-API angewiesen(in der diese Funktion steckt), bei Windows Win32API.
Bei Linux die Libs von KDE oder Gnome...
Mit der STL wirst du da nicht weit kommen, wie Knuddelbaer schon gesagt hat.cu max
-
Man baut sich eine Proxyklasse die alles kann was man braucht und Implementiert diese für sein OS wenn dies nicht schon geschehen ist.
So wirst Du "scheinbar" portabel in dem Du Deinem Programm die OS Details versteckst.
-
Master_Max schrieb:
Knuddelbaer schrieb:
Generell bist Du auf Betriebssystemspezifische Funktionalitäten angewiesen
Bruder_S schrieb:
Ach: Ist das jetzt OS unabhängig? Kommt das nicht darauf an, unter welchem Betriebssystem ich die cpp kompiliere?
Nein, du bist auf eine Betriebssytem-API angewiesen(in der diese Funktion steckt), bei Windows Win32API.
Bei Linux die Libs von KDE oder Gnome...
Mit der STL wirst du da nicht weit kommen, wie Knuddelbaer schon gesagt hat.cu max
Moment...das war jetzt zu hoch für mich...
Ganz langsam: Unter dem Link habe ich ja die Dirstream gefunden und ein Beispielprogramm.
In meiner cpp, die ich schreibe, binde ich diese Dirstream.h ja ein und verwende sie.
Zu welchem Zeitpunkt kommt jetzt das System ins Spiel? Kann ich die Dirstream nur unter Windows verwenden???
Ich will das ganze foglendermaßen machen:
-
ich schreibe die cpp unter Windows...somit binde ich ja nur im Quellcode meiner cpp die dirstream ein
-
ich gebe die cpp einem Kumpel, der die dann unter Linux komiliert und somit eine exe daraus erzeugt
-
dort soll die exe laufen
Das Programm selber soll also nicht OS-unabhängig sein...da reichts mir, wenns nachher nur unter Linux läuft! Aber da ich kein Linux hier zuhause habe, will ich die cpp unter Windows schreiben...
Vielleicht habe ich mich da undeutlich ausgedrückt oder ich habe was falsch verstanden, aber nach Dir müßte die Dirstream dann ja nur unter Windows verwendet werden können...
-
-
Knuddlbaer schrieb:
Man baut sich eine Proxyklasse die alles kann was man braucht und Implementiert diese für sein OS wenn dies nicht schon geschehen ist.
So wirst Du "scheinbar" portabel in dem Du Deinem Programm die OS Details versteckst.
Moment...das war ein Tick zuviel;) Aber ich bin ehrlich und sage, wenn ich was nicht verstehe!
Noch einmal; ich möchte folgendes machen:
-
Schreiben der cpp unter Windows (da habe ich jetzt diese dirstream.h eingebunden)
-
die cpp bekommt dann ein Freund von mir, der sie unter linux kompiliert
-
bei ihm unter linux soll das programm (also die exe, die er erzeugt hat) laufen
Geht das jetzt so oder was muss ich beachten?
-
-
Sorry, wenn ich dich verwirrt habe. Ich dachte,
das die Dirstream WinAPI Funktionen nutzt. Dann läuft sie nur unter Windows.
allerdings habe ich mich beim googlen eines besseren belehren lassen.
Die Dirstream.h läuft auch unter Linux.google schrieb:
DirStream Class Reference [C++ Wrapper for Standard UNIX Functions].
Sorry für die Verwirrung.
cu max
-
Master_Max schrieb:
Sorry, wenn ich dich verwirrt habe. Ich dachte,
das die Dirstream WinAPI Funktionen nutzt. Dann läuft sie nur unter Windows.
allerdings habe ich mich beim googlen eines besseren belehren lassen.
Die Dirstream.h läuft auch unter Linux.google schrieb:
DirStream Class Reference [C++ Wrapper for Standard UNIX Functions].
Sorry für die Verwirrung.
cu max
Na wunderbar, dann sollte es ja so laufen, wie ich es mir vorstelle...ich hatte über die Dirstream auch schon mal was gelesen, dass sie osunabhängig sein sollte..., aber da war das nicht so gut beschrieben...danke euch beiden....
-
Das hängt von der Implementierung des Dirstreams ab. Da ich selbst den Stream noch nie bentzt habe kann ich Dir nichts zu sagen. Aber ich gehe sehr stark davon aus
das Hume eine Doku geschrieben hat in der Du diese Detaills findest.Ansonsten ein Beispiel (ich kenne mich aber mit Linux nicht aus).
Du willst eine Klasse haben die eine MessageBox erzeugt. Das Programm ist ansonsten portabel, nur diese Messagebox nicht.
Nun willst Du aber auch nicht im Quellcode selbst rumbauen, sondern sehr bequem den Quellcode im Hauptprogramm verwenden.Dazu baut man sich hilfsklassen:
strucht MessageWindows { void doMessage(const std::string & message){MessageBox(NULL,message.c_str(),message.c_str(),NULL);} } struct LinuxMessage { void doMessage(const std::string & message){//Linuxspezifischer Code zum erstellen einer MSG Box);} }
Du kannst nun mit Policy oder mit Virtuellen Methoden Arbeiten.
Beim ersten sorgst Du dafür das Deine Klasse z.B. MessageBoxHolder von einer der beiden Klassen erbt. Du kannst dann MessageBoxHolder.doMessage() aufrufen.
(Stichwort Policy)template <class T> struct MessageBoxHolder : public T { // Ein paar andere Grundlegende Funktionen } MessageBoxHolder<WindowsMessage> t; t.doMessage("Hallo Welt");
Oder Du erbst von MessageBoxHolder als Basisklasse mit virtuellem doMessage und gibst entweder MessageWindows oder LinuxWindows an die aufrufende Klasse (bzw. Objekt) weiter.
struct MessageBoxHolder { // andere Methoden virtual doMessage(const std::string &) = 0; } strucht MessageWindows : public MessageBoxHolder { void doMessage(const std::string & message){MessageBox(NULL,message.c_str(),message.c_str(),NULL);} } struct LinuxMessage : public MessageBoxHolder { void doMessage(const std::string & message){//Linuxspezifischer Code zum erstellen einer MSG Box);} } void foo(MessageBoxHolder * msg) { msg->doMessage("Hallo Welt"); // Dem hier ists schnuppe ob Windows oder Linux } MessageWindows wmsg; MessageLinux lmsg; foo(wmsg); // Windows Variante foo(lmsg); // Linux Variante
Du sorgst einfach für eine Einheitliche Schnittstelle. Die Funktionalität hinter dieser Schnitstelle ist dann total verschieden. Wie man diese im Detail verstecken kann hängt von den Anforderungen im einzelnen ab.
-
Okay...ich habe zwar nicht alles verstanden, aber probiere es mal und dann werden wir ja sehen, ob es funktioniert...
Übrigens schreibe ich eh nur eine Konsolenanwendung...