Ich möchte ein sehr einfaches virtuelles Dateisystem (VFS) implementieren, das einige grundlegende Dateisystemoperationen wie fwrite unterstützt, fopen, fput, etc. Das VFS ist eine Abstraktionsschicht über einigen konkreten OS, z.B. Windows, Linux usw. Nehmen wir jetzt an, dass Die fopen-Schnittstelle sieht ungefähr so aus
%Vor%Nun frage ich mich, wie ich bei der tatsächlichen Umsetzung dieser Schnittstelle die Unterscheidung darüber treffen kann Dateisystem, mit dem ich spreche. Gibt es in C etwas, das mir sagt, auf welchem Betriebssystem die Anwendung läuft, so dass Ich könnte so etwas tun:
%Vor%BEARBEITEN:
Nun frage ich mich, ob jemand weiß, wo ich die Systemaufrufe für Dateioperationen für Windows finden kann? Es ist leicht, sie für Linux zu finden, aber ich hatte Mühe, etwas Ähnliches für Windows zu finden, z. Ich wäre an den Systemaufrufen interessiert, um eine Datei zu öffnen, eine Datei zu schreiben, etc.
Noch eine Anmerkung: Das C stdio.h bietet eine Reihe von IO-Operationen wie
%Vor%Mit anderen Worten, ich muss die fopen-Routine in meinem VFS nicht neu implementieren, da die Gnu C-Bibliothek sich darum kümmert, mit welchem OS es zu tun hat, ist das richtig? Ich muss nur Funktionen implementieren, die nicht von der stdio-Bibliothek unterstützt werden, z. Erstellen von Verzeichnissen, die sich von Dateisystem zu Dateisystem unterscheiden?
Danke
Vielleicht wäre die einfachste / sauberste Implementierung, zwei separate Bibliotheken zu erstellen, eine für Windows und eine für Linux, ohne Ihren Code mit den kaskadierten Anweisungen if
und switch
zu verschwenden. Die Bibliotheken würden die gleichen Funktionen implementieren, die in einem gemeinsamen Header definiert sind.
Denken Sie auch daran, dass der Code in Ihrem Scheck OS == something
auf allen Systemen kompiliert und verlinkt wäre, also z. Die auf Linux kompilierte Bibliothek sollte in der Lage sein, die Windows-Systemaufrufe aufzulösen ...
Ich denke, das Trennen von Dingen (verschiedene Betriebssysteme, verschiedene cpp-Dateien) ist die einfachste Lösung.
BEARBEITEN :
Wenn Sie C ++ verwenden, warum verlassen Sie sich nicht einfach auf Streams ? Die Standardbibliothek bietet bereits die Funktionalität, die Sie implementieren möchten, und ist auf allen Plattformen verfügbar.
Ansonsten, hier ist ein Link zu Windows-Dateiverwaltungsfunktionen .
ZWEITE BEARBEITUNG :
Wenn Sie eine plattformübergreifende Dateisystembibliothek wünschen, die unter anderem die Verzeichniserstellung unterstützt, können Sie die Dateisystembibliothek erweitern .
Ich glaube nicht, dass Sie ein Modul für verschiedene Betriebssysteme nach Ihren Wünschen kompilieren können.
%Vor%Tatsächlich umgesetzt, also aus Erfahrung hier:
Als erstes müssen Sie Klassen verwenden. Es gibt kein fopen()
Äquivalent. Wenn es Flags gibt, werden sie ein Enum sein. Dateinamen sind wchar_t heutzutage.
Als zweites müssen Sie die Betriebssystem-abhängigen Teile Ihrer Dateiklasse ausschließen. Sie sollten in getrennten Methoden sein. Sie verschieben diese in eine separate Datei. Für jedes Betriebssystem, das Sie haben, wird es eine andere Datei geben, die dieselben Methoden implementiert. Wenn Sie Ihre App verknüpfen, kennen Sie die Zielarchitektur, und Sie können die richtigen Versionen auswählen.
Standard C hat keine solche Funktion. Beachten Sie, dass der Begriff "konkretes Betriebssystem" auch etwas vage ist: Sind Windows XP und Windows Vista das gleiche "konkrete Betriebssystem" oder andere? Sind CentOS und Ubuntu das gleiche Betriebssystem oder andere?
Offenbar suchen Sie nur nach API-Unterschieden. In den meisten Fällen können Sie Versionsunterschiede und Verteilungsunterschiede wahrscheinlich ignorieren (obwohl sowohl Windows als auch Linux von Zeit zu Zeit neue Systemaufrufe generieren). In diesem Fall ist es am besten, eine Präprozessor-bedingte Kompilierung durchzuführen - da der Code, der Linux-spezifische Aufrufe durchführt, nicht einmal unter Windows kompiliert wird.
Traditionell haben die System-Compiler verschiedene vordefinierte Makros. Hier sind ein paar solcher Makros, auf entsprechenden Systemen: _WIN32
, __linux
, __linux__
, __AIX__
, __hpux
, ... Wenn Sie ein bestimmtes System identifizieren müssen, sollten Sie erneut nach SO fragen.
Wenn Sie nach einer Möglichkeit suchen, sich von den Eigenschaften des verwendeten Dateisystems (Pfadtrennzeichen usw.) zu lösen, und wenn Sie mit einer C ++ - Lösung nur zufrieden sind, werfen Sie einen Blick auf Boost.Filesystem .
Pfade können im portablen generischen Pfadformat (im Grunde POSIX-Format) angegeben werden und werden automatisch in das ursprüngliche Format konvertiert:
%Vor% Elemente können mit dem Operator /
auf den Pfad verkettet werden, und das Ergebnis kann dann direkt zum Öffnen einer Datei verwendet werden:
Diese Funktionalität ist Teil von Technical Report 2, was bedeutet, dass sie wahrscheinlich in die Standardbibliothek einfließen wird.
Tags und Links c++ filesystems