iostreams und errno?
-
aber dort gibt es doch gar keine klasse für dateien
-
Artchi schrieb:
Herr Gott, dann benutzt boost::filesystem.
Hmm, mal sehen. Vielleicht kann das ja wirklich was...
Danke für den Tip.EDIT: Ich hoffe nur, dass das auch UNC-Namen kann unter Windows.
-
hmmmmmmmm schrieb:
aber dort gibt es doch gar keine klasse für dateien
Ehm, neee, die machen eine Dateisystem-Librarie ohne Datei-Klassen. Neee, is' klar.
-
Ringding schrieb:
EDIT: Ich hoffe nur, dass das auch UNC-Namen kann unter Windows.
Ehm, du meinst UTF16? Also gerade da hapert es glaub ich noch an der Lib, obwohl die Lib ansonst super ist. Hat jemand erst letztens in der boost-Mailingliste angesprochen, das er an der Stelle Schwierigleiten hatte. Aber probier es einfach mal aus.
-
dann sag bitte wie die heißt.
-
Nein, nicht UTF16. Sondern alles, was mit "\" anfängt (für Zugriff auf Netzwerkshares hauptsächlich, man kann damit aber auch auf Diskettenlaufwerke, Festplattenpartitionen, USB-Devices und weiß der Geier was noch zugreifen).
-
hmmmmmmmmm schrieb:
dann sag bitte wie die heißt.
Schau doch einfach mal in die doku rein. Mit den folgenden MItteln arbeitet kann man auf das Filesystem zugreifen:
Mit boost::filesystem::path bestimmst du erstmal ein Verzeichnis oder eine Datei.
Mit boost::filesystem kannst du auf path Operationen durchführen (iterieren, löschen, kopieren, bestimmte Attribute prüfen usw.)
Mit boost::filesystem::fstream kannst du auf path letztendlich den Inhalt streamen.
Wenn das mal nicht nützliche Funktionen und Klassen sind, die was mit Dateien zu tun haben, dann weiß ich auch nicht.

-
Ringding schrieb:
Nein, nicht UTF16. Sondern alles, was mit "\" anfängt (für Zugriff auf Netzwerkshares hauptsächlich, man kann damit aber auch auf Diskettenlaufwerke, Festplattenpartitionen, USB-Devices und weiß der Geier was noch zugreifen).
Achso! Ehm... hem, kann ich jetzt leider auch nicht sagen, war noch nie in der Situation. Aber wenn ich die Doku richtig verstehe, wurde dies schon beachtet aber noch nicht ausführlich getestet. Weiterhin mußt du keine Backslashes benutzen sondern Slashes, das, wird intern dann umgewandelt. Also "//share" benutzen und nicht "\\share".
-
Ok das habe ich alles schon in der Dokumentation gesehen aber das hilft bei Ringdings Problematik doch überhaupt nichts?!?
Also da ist ja jetzt keine eigene Klasse für die Dateiverarbeitung drin wie std::fstream. boost::filesystem::fstream ist ja nur dafür da das alle Funktionen Path& aktzeptieren.
-
Es wird ihm in sofern mehr helfen, das er aussagekräftigere Exceptions geworfen bekommt. Welche man hier sehen kann:
http://www.boost.org/libs/filesystem/doc/exception.htmIch finde das schon um einiges besser. Er kann z.B. auch vorher mit den operations abfragen ob eine Datei überhaupt existiert, oder ob sie überhaupt eine Datei und kein Verz. ist. Und selbst wenn das alles geklappt hat und er versucht z.B. eine schreibgeschützte Datei zu beschreiben oder zu löschen, bekommt er eine Exception mit einem read_only_error und einer Betriebssystem-Message als Errortext die er dem User präsentieren kann.
Wenn man vielleicht noch mehr haben will (was wohl seltener der Fall sein dürfte) müsste er letztendlich direkt sein OS zugreifen. Aber boost::filesystem versucht schon das meiste zu lösen.
-
Und selbst wenn das alles geklappt hat und er versucht z.B. eine schreibgeschützte Datei zu beschreiben oder zu löschen, bekommt er eine Exception mit einem read_only_error und einer Betriebssystem-Message als Errortext die er dem User präsentieren kann.
Welche Funktion wirft die Exception beim beschreiben?
Beim Löschen ists ja logisch, da gibts ne extra Funktion.
-
Artchi schrieb:
Achso! Ehm... hem, kann ich jetzt leider auch nicht sagen, war noch nie in der Situation. Aber wenn ich die Doku richtig verstehe, wurde dies schon beachtet aber noch nicht ausführlich getestet. Weiterhin mußt du keine Backslashes benutzen sondern Slashes, das, wird intern dann umgewandelt. Also "//share" benutzen und nicht "\\share".
Soweit ich mich entsinne werden bezüglich UNC ohne hin Slashes, nicht Backslashes verwandt.
Und
@Ringding bei boost::filesystem tut sich soweit ich das verfolge noch einiges, und (für boost-Verhältnisse) ist vieles implementation defined, insbesondere wenn es Richtung multiple-root etc geht...
-
höö schrieb:
Welche Funktion wirft die Exception beim beschreiben?
Sind wir hier im Kindergarten oder was???
Steht alles auf der ersten Seite der Doku unter Common Specs!
-
finix schrieb:
@Ringding bei boost::filesystem tut sich soweit ich das verfolge noch einiges, und (für boost-Verhältnisse) ist vieles implementation defined, insbesondere wenn es Richtung multiple-root etc geht...
Kein Wunder, boost::filesystem wird gerade dem C++ Committee vorgeschlagen für den TR2, da dürfen die keine Müdigkeit vorschützen lassen. Kann mir gut vorstellen, das dieser Lib zugestimmt wird (boost::regex, boost::shared_ptr u.a. haben es ja schon geschafft).
-
Ich werde das mal ausprobieren mit den Backslashes. Für UNC wird normalerweise schon \\ verwendet. Und es geht ja nicht darum, wie ich das schreibe, weil Filenamen normalerweise von der Kommandozeile oder per Drag & Drop hereinkommen, und dann enthalten sie natürlich gemäß Windows-Konvention Backslashes (obwohl es Windows egal ist - das akzeptiert auch normale slashes). Es wäre schon etwas lästig, wenn ich jeden Filenamen, der auf der Kommandozeile hereinkommt, erst umbauen müsste, nur damit ich das File überhaupt öffnen kann.
-
Artchi schrieb:
höö schrieb:
Welche Funktion wirft die Exception beim beschreiben?
Sind wir hier im Kindergarten oder was???
Steht alles auf der ersten Seite der Doku unter Common Specs!Raff ich immer noch nicht.

Ich mein wenn ich mit boost::filesystem::fstream versuche eine Datei zu öffnen und diese nicht geöffnet werden kann, passiert doch das gleiche wie bei std::fstream! (man erhält keine speziellen Exceptions)