9
votes

Système de fichiers virtuel simple en C / C ++

Je voudrais mettre en place un système de fichiers virtuel très simple (VFS) qui prend en charge une opération de base du système de fichiers de base comme Fcrite, fopen, fput, etc. Le VFS est une couche d'abstraction sur un système d'exploitation concret, par ex. Windows, Linux, etc. Supposons maintenant que L'interface fopen ressemble à ce que ceci xxx pré>

maintenant je me demande comment je peux faire dans la mise en œuvre réelle de cette interface la distinction sur laquelle Système de fichiers je parle. Y a-t-il dans C quelque chose qui me dit sur quel OS l'application est en cours d'exécution pour que Je pourrais faire quelque chose comme ceci: p> xxx pré>

edit: strong> p>

Maintenant, je me demande si quelqu'un sait où je peux trouver où je peux trouver le Appelle système pour les opérations de fichier pour Windows? Il est facile de les trouver pour Linux mais j'ai eu du mal à trouver quelque chose de similaire pour Windows, par ex. Je serais intéressé par les appels système pour ouvrir un fichier, écrire un fichier, etc. p>

sur une autre note: le c stdio.h offre un certain nombre d'opérations de stand io comme P>

FILE * fopen (const char *filename, const char *opentype)


1 commentaires

Votre question n'est pas claire de savoir si vous avez besoin d'un commutateur de système de fichiers virtuel pour de nombreux systèmes de fichiers différents (EXT2, FAT) ou si vous souhaitez basculer entre les OSES.


6 Réponses :


13
votes

Peut-être que la mise en œuvre la plus simple / la plus propre serait de créer deux bibliothèques distinctes, une pour Windows et une pour Linux, sans joindre votre code avec Cascaded si et commutateurs . Les bibliothèques implémenteraient les mêmes fonctions, définies dans un en-tête commun.

Également, rappelez-vous que le code de votre chèque os == quelque chose serait compilé et lié sur tous les systèmes, donc par exemple. La bibliothèque compilée sur Linux devrait pouvoir résoudre les appels de système Windows ...

Je pense que séparer les choses (système d'exploitation différent, différents fichiers CPP) est la solution la plus simple.

Modifier :

Si vous utilisez C ++, pourquoi ne pas simplement s'appuyer sur flux ? La bibliothèque standard fournit déjà la fonctionnalité que vous essayez d'implémenter et est disponible sur toutes les plateformes.
Sinon, voici un lien vers Fonctions de gestion de fichiers Windows .

deuxième modification :

Si vous souhaitez une bibliothèque de systèmes de fichiers multiples-de-plate-forme, en prenant en charge entre autres éléments de création de répertoires, vous pouvez vérifier le Boost FilesSystem Library .


2 commentaires

J'aime l'idée avec l'en-tête commun et les différentes bibliothèques pour les différents systèmes d'exploitation. En substance, j'ai alors juste pour faire ce que Nick D. a suggéré et inclure la bibliothèque correspondante en fonction du système d'exploitation.


Ou plutôt, lorsque vous construisez une solution Windows, vous liez la bibliothèque Windows, etc. Vous incluez l'en-tête commun dans les deux cas: la compilation sera la même chose que des éléments spécifiques à la plate-forme seront pris en compte dans la phase de liaison.



7
votes

Je ne pense pas que vous puissiez compiler un module pour différents OSES, votre choix. XXX


3 commentaires

Bien sûr, si vous souhaitez tout garder dans un seul fichier, la distinction doit être effectuée à l'heure de la compilation (+1). Je pense toujours que la séparation des choses est meilleure.


Merci beaucoup. C'était aussi une approche que j'avais pensé à! Donc, la combinaison avec la réponse Orsogufo devrait-elle me donner un bon départ!


Oui je suis d'accord. En fait, c'est un modèle commun pour concevoir des projets de plateformes croisées.



6
votes

Vous pouvez essayer PhysicsFs bibliothèque.


1 commentaires

L'OP vous demandait comment implémenter un système de fichiers virtuel, ne pas demander des suggestions sur les bibliothèques.



0
votes

Standard C n'a pas de telle caractéristique. Notez que la notion de «système d'exploitation concrète» est également un peu vague: Windows XP et Windows Vista est-il le même «système d'exploitation concret» ou différents? Sont Centos et Ubuntu le même système d'exploitation, ou différents?

Apparemment, vous ne recherchez que des différences d'API, donc dans la plupart des cas, vous pouvez probablement ignorer les différences de version et les différences de distribution (bien que Windows et Linux poussent de nouveaux appels de système de temps à autre). Dans ce cas, il est préférable que la compilation conditionnelle préprocesseur - puisque le code rendant les appels spécifiques à Linux ne compilent même pas sur Windows.

Traditionnellement, les compilateurs système ont diverses macros prédéfinies. Voici quelques macros de ce type, sur des systèmes respectifs: _win32 , __ linux , __ linux __ , __ aix __ , __HPUX , ... si vous devez identifier un système spécifique, vous devez demander à nouveau à nouveau.


0 commentaires

1
votes

effectivement implémenté cela, donc de l'expérience ici:

La première chose à faire est d'utiliser des cours. Il n'y a pas de fopen () équivalent. S'il y a des drapeaux, ils vont être une énumération. Les noms de fichiers sont de nos jours WCHAR_T.

La deuxième chose à faire est de définir les parties dépendantes du système d'exploitation de votre classe de fichiers. Ils devraient être dans des méthodes distinctes. Vous les déplacez dans un fichier séparé. Pour chaque système d'exploitation que vous avez, il y aura un fichier différent implémentant les mêmes méthodes. Lorsque vous associez votre application, vous connaissez l'architecture cible et vous pouvez choisir les versions correctes.


0 commentaires

0
votes

Si vous recherchez un moyen de résumé vous-même des propriétés du système de fichiers que vous utilisez (séparateurs de chemin, etc.), et si vous êtes satisfait d'une solution C ++ - Seule une solution, jetez un coup d'œil à Boost.FileSystem .

Les chemins peuvent être spécifié dans le format em> le format de chemin générique portable em> (Format Fondamentalement POSIX) et sont automatiquement convertis au format natif: P>

ifstream file1( my_path / "foo/bar" );


0 commentaires