Question

Quelles sont les différences, et dans quels cas l'un ou l'autre prouverait supérieur en quelque sorte?

Était-ce utile?

La solution

D'abord la fonction fopen peut être utilisé que pour des opérations simples portables avec des fichiers.

CreateFile de l'autre côté peut être utilisé non seulement pour les opérations avec des fichiers, mais aussi avec des répertoires (avec utilisation des options correspondantes), les tuyaux et les différents périphériques Windows.

CreateFile a beaucoup de commutateurs supplémentaires utiles, comme FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY et FILE_FLAG_SEQUENTIAL_SCAN, qui peuvent être très utiles dans différents scénarios.

Vous pouvez utiliser CreateFile avec un nom de fichier plus que les caractères MAX_PATH. Il peut être important pour certaines applications de serveur ou celles qui doivent être en mesure d'ouvrir any fichier (un scanner de virus ou une application de sauvegarde par exemple). Cette fonction est activée en utilisant la sémantique d'espace de noms, bien que ce mode a ses propres préoccupations, comme la capacité à créer réellement un fichier nommé ".." ou L"\xfeff\x20\xd9ab" (bonne chance d'essayer de les supprimer plus tard).

Vous pouvez utiliser CreateFile dans différents scénarios de sécurité. Je veux dire non seulement l'utilisation des attributs de sécurité. Si processus actuel a le privilège SE_BACKUP_NAME ou SE_RESTORE_NAME (comme les administrateurs ont généralement) et activer ce privilège, on peut utiliser CreateFile pour ouvrir tout fichier également un fichier auquel vous n'avez pas accès par descripteur de sécurité.

Si vous voulez seulement lire le contenu d'un fichier, vous pouvez utiliser CreateFile, CreateFileMapping et MapViewOfFile pour créer le mappage du fichier. Ensuite, vous pouvez travailler avec un fichier comme un bloc de mémoire, ce qui peut éventuellement augmenter la vitesse de votre application.

Il y a aussi d'autres utilisations de la fonction, qui sont décrits en détail dans l'article MSDN correspondant.

Je peux résumer: seulement si vous avez une des exigences de portabilité dur ou si vous devez passer un FILE* à une bibliothèque externe, vous devez utiliser fopen. Dans tous les autres cas, je vous recommande d'utiliser CreateFile. Pour de meilleurs résultats, je vous conseille aussi d'apprendre API Windows spécifiquement, car il y a de nombreuses fonctionnalités que vous pouvez trouver un bon usage pour.

MISE À JOUR : Pas directement lié à votre question, mais je vous recommande également de prendre un coup d'oeil à E / S transactionnelles fonctions qui sont prises en charge à partir de Windows Vista. Grâce à cette fonctionnalité, vous pouvez commettre un tas d'opérations avec des fichiers, des répertoires ou registre comme une transaction qui ne peut pas être interrompue. Il est un outil très puissant et intéressant. Si vous n'êtes pas prêt maintenant à utiliser les fonctions d'E / S transactionnelles, vous pouvez commencer avec CreateFile et le port de votre application au plus tard E / S transactionnelles.

Autres conseils

Cela dépend vraiment de quel type de programme que vous écrivez. S'il est censé être portable, fopen vous rendra la vie plus facile. fopen appellera CreateFile "dans les coulisses".

Quelques options plus avancées (contrôle de cache, le contrôle d'accès aux fichiers, etc.) ne sont disponibles que si vous utilisez l'API Win32 (ils dépendent de la poignée de fichier Win32, par opposition au pointeur de FILE dans stdio), donc si vous êtes écriture d'une application pure Win32, vous voudrez peut-être utiliser CreateFile.

CreateFile vous permet de

  • Ouvrir un fichier pour I / O
  • asynchrone
  • conseils d'optimisation passer comme FILE_FLAG_SEQUENTIAL_SCAN
  • Définir les paramètres de sécurité et Hériter sans problèmes de filetage

Ils ne renvoient pas le même type de poignée, avec un objet fopen / FILE vous pouvez appeler d'autres fonctions d'exécution telles que fputs (ainsi que la conversion à un descripteur de fichier « natif »)

Chaque fois que possible, préfèrent des enveloppes orientées objet que le soutien RAII, comme fstream ou fichier boost objets IO.

Vous devriez, bien sûr, les soins sur le mode de partage, de sorte fopen () et STL ne suffisent pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top