Frage

Was sind die Unterschiede, und in welchen Fällen die eine oder andere würde sich als überlegen in irgendeiner Weise?

War es hilfreich?

Lösung

Vor allem der Funktion fopen kann nur für einfache tragbare Operationen mit Dateien verwendet werden.

CreateFile auf der anderen Seite verwendet werden kann, nicht nur für Operationen mit Dateien, sondern auch mit Verzeichnissen (mit Verwendung von entsprechenden Optionen), Rohren und verschiedenen Windows-Geräten.

CreateFile viele weitere nützliche Schalter hat, wie FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY und FILE_FLAG_SEQUENTIAL_SCAN, die in verschiedenen Szenarien sehr nützlich sein kann.

Sie können CreateFile mit einem Dateinamen verwenden mehr, dass MAX_PATH Zeichen. Es kann für einige Server-Anwendungen oder solche wichtig sein die in der Lage sein muss, öffnen alle Datei (einen Virenscanner oder eine Backup-Anwendung zum Beispiel). Dies wird ermöglicht durch Namespace-Semantik, obwohl dieser Modus seine eigene Bedenken hat, wie Fähigkeit, tatsächlich eine Datei namens ".." erstellen oder L"\xfeff\x20\xd9ab" (viel Glück zu versuchen, sie später löschen).

Sie können CreateFile in verschiedenen Sicherheitsszenarien verwenden. Ich meine nicht nur Verwendung von Sicherheitsattributen. Wenn sich die derzeitigen Prozess SE_BACKUP_NAME oder SE_RESTORE_NAME Privileg hat (wie Administratoren haben in der Regel) und dieses Privileg zu ermöglichen, kann man CreateFile zu öffnen jede Datei auch eine Datei, auf die Sie keinen Zugriff durch Sicherheitsbeschreibung haben verwenden.

Wenn Sie nur den Inhalt einer Datei lesen möchten, können Sie CreateFile, CreateFileMapping und MapViewOfFile verwenden, um Dateizuordnung zu erstellen. Dann können Sie mit einer Datei als mit einem Speicherblock arbeiten, die möglicherweise Ihre Anwendung der Geschwindigkeit erhöhen.

Es gibt auch andere Verwendungen der Funktion, die im Detail beschrieben ist in der entsprechende MSDN-Artikel.

Also ich zusammenfassen kann: nur, wenn Sie eine harte Portabilität Anforderungen haben oder wenn Sie eine FILE* zu einer externen Bibliothek übergeben müssen, dann müssen Sie verwenden fopen. In allen anderen Fällen würde ich Ihnen empfehlen CreateFile zu verwenden. Die besten Ergebnisse erzielen, würde ich raten auch speziell Windows-API zu lernen, da es viele Funktionen sind, dass Sie eine gute Verwendung finden können.

AKTUALISIERT : Nicht direkt zu Ihrer Frage, aber ich empfehle Sie auch einen Blick auf Transaktions I / O Funktionen, die mit Windows Vista werden unterstützt starten. Mit dieser Funktion können Sie eine Reihe von Betrieb mit Dateien, Verzeichnissen oder Registrierung als eine Transaktion begehen, die nicht unterbrochen werden können. Es ist ein sehr leistungsfähiges und sehr interessantes Gerät. Wenn Sie nicht bereit sind, jetzt die transaktionelle E / A-Funktionen zu nutzen, können Sie mit CreateFile und Port Ihrer Anwendung Transaktions I / O später beginnen.

Andere Tipps

Das hängt wirklich davon ab, welche Art von Programm, das Sie schreiben. Wenn es soll tragbar sein wird fopen Ihr Leben leichter machen. fopen ruft CreateFile "hinter den Kulissen".

Einige erweiterte Optionen (Cache-Steuerung, Dateizugriffskontrolle, etc.) sind nur verfügbar, wenn Sie die Win32-API verwenden (sie sind abhängig von der Win32-Datei-Handle, im Gegensatz zu dem FILE Zeiger in stdio), also wenn Sie eine reine Win32-Anwendung zu schreiben, können Sie Createfile verwenden.

Createfile können Sie

  • Öffnen Sie die Datei für asynchrone E / A
  • Pass Optimierungshinweise wie FILE_FLAG_SEQUENTIAL_SCAN
  • Set Sicherheit und vererben Einstellungen ohne Probleme Einfädeln

Sie haben nicht geben den gleichen Griff-Typ, mit fopen / FILE Objekt, das Sie anderen Runtime-Funktionen aufrufen können wie fputs (sowie es zu einem „native“ Datei-Handle Umwandlung)

Wenn möglich, bevorzugt objektorientierte Wrapper, dass die Unterstützung RAII, wie fstream oder Boost-Datei IO-Objekte.

Sie sollten natürlich, kümmern sich um den Share-Modus, so fopen () und STL sind unzureichend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top