Einfaches virtuelles Dateisystem in C / C ++

8

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

    
halfer 01.09.2009, 09:50
quelle

6 Antworten

13

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 .

    
Paolo Tedesco 01.09.2009 09:58
quelle
7

Ich glaube nicht, dass Sie ein Modul für verschiedene Betriebssysteme nach Ihren Wünschen kompilieren können.

%Vor%     
Nick Dandoulakis 01.09.2009 10:04
quelle
6

Sie können PhysicsFS Bibliothek ausprobieren.

    
Eugene Bujak 01.09.2009 10:06
quelle
1

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.

    
MSalters 01.09.2009 10:10
quelle
0

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.

    
Martin v. Löwis 01.09.2009 10:07
quelle
0

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:

%Vor%

Diese Funktionalität ist Teil von Technical Report 2, was bedeutet, dass sie wahrscheinlich in die Standardbibliothek einfließen wird.

    
Martin B 01.09.2009 11:34
quelle

Tags und Links