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 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> 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)
6 Réponses :
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 Également, rappelez-vous que le code de votre chèque Je pense que séparer les choses (système d'exploitation différent, différents fichiers CPP) est la solution la plus simple. P>
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. 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 . P> si code> et
commutateurs code>. Les bibliothèques implémenteraient les mêmes fonctions, définies dans un en-tête commun. P>
os == quelque chose code> 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 ... P>
Sinon, voici un lien vers Fonctions de gestion de fichiers Windows a >. P>
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.
Je ne pense pas que vous puissiez compiler un module pour différents OSES, votre choix.
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 i> pour concevoir des projets de plateformes croisées.
Vous pouvez essayer PhysicsFs bibliothèque. P>
L'OP vous demandait comment implémenter un système de fichiers virtuel, ne pas demander des suggestions sur les bibliothèques.
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? P>
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. P>
Traditionnellement, les compilateurs système ont diverses macros prédéfinies. Voici quelques macros de ce type, sur des systèmes respectifs: _win32 code>,
__ linux code>,
__ linux __ code>,
__ aix __ code>,
__HPUX code>, ... si vous devez identifier un système spécifique, vous devez demander à nouveau à nouveau. P>
effectivement implémenté cela, donc de l'expérience ici: p>
La première chose à faire est d'utiliser des cours. Il n'y a pas de 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. P> fopen () code> équivalent. S'il y a des drapeaux, ils vont être une énumération. Les noms de fichiers sont de nos jours WCHAR_T. P>
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" );
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.