違いは何ですか?また、どのような場合に、どちらか一方が何らかの点で優れていることが証明されますか?
4 に答える
まず第一に、この関数fopen
はファイルを使用した単純な移植操作にのみ使用できます。
CreateFile
反対側では、ファイルの操作だけでなく、ディレクトリ (対応するオプションを使用)、パイプ、およびさまざまな Windows デバイスの操作にも使用できます。
CreateFile
FILE_FLAG_NO_BUFFERING
には、 、、 などの便利なスイッチが多数追加されてFILE_ATTRIBUTE_TEMPORARY
おりFILE_FLAG_SEQUENTIAL_SCAN
、さまざまなシナリオで非常に役立ちます。
その文字CreateFile
より長いファイル名で使用できます。これは、一部のサーバー アプリケーションや、任意のMAX_PATH
ファイルを開くことができる必要があるアプリケーション(ウイルス スキャナーやバックアップ アプリケーションなど) にとって重要な場合があります。これは名前空間のセマンティクスを使用することで有効になりますが、このモードにはorという名前のファイルを実際に作成する機能など、独自の問題があります(後でそれらを削除しようとして頑張ってください)。".."
L"\xfeff\x20\xd9ab"
CreateFile
さまざまなセキュリティ シナリオで使用できます。セキュリティ属性の使用だけではありません。現在のプロセスが SE_BACKUP_NAME または SE_RESTORE_NAME 権限 (管理者が通常持っている権限) を持っている場合、この権限を有効にすると、セキュリティ記述子を介してアクセスできないファイルCreateFile
も開くことができます。
ファイルのコンテンツを読み取るだけの場合はCreateFile
、CreateFileMapping
とを使用MapViewOfFile
してファイル マッピングを作成できます。次に、ファイルをメモリ ブロックと同じように操作できるため、アプリケーションの速度が向上する可能性があります。
この関数には他にも使用方法があり、対応する MSDN の記事で詳しく説明されています。
要約すると、移植性の要件が厳しい場合、または aFILE*
を外部ライブラリに渡す必要がある場合にのみ、 を使用する必要がありますfopen
。それ以外の場合は、 を使用することをお勧めしますCreateFile
。最良の結果を得るには、特に Windows API を学習することをお勧めします。これは、適切な用途を見つけることができる多くの機能があるためです。
UPDATED : 質問とは直接関係ありませんが、Windows Vista 以降でサポートされているトランザクション I/O機能を一瞥することもお勧めします。この機能を使用すると、中断できない 1 つのトランザクションとして、ファイル、ディレクトリ、またはレジストリを使用して一連の操作をコミットできます。これは非常に強力で興味深いツールです。トランザクション I/O 関数を使用する準備ができていない場合は、CreateFile
後でトランザクション I/O にアプリケーションを移植して開始できます。
それは、あなたが書いているプログラムのタイプに本当に依存します。携帯性があればfopen
、生活が楽になります。「舞台裏」fopen
と呼びます。CreateFile
FILE
より高度なオプション (キャッシュ制御、ファイル アクセス制御など) は、Win32 API を使用している場合にのみ使用できます ( stdioのポインターではなく、Win32 ファイル ハンドルに依存します)。アプリケーションでは、CreateFile を使用することをお勧めします。
CreateFile を使用すると、
- 非同期 I/O 用にファイルを開く
- FILE_FLAG_SEQUENTIAL_SCAN などの最適化のヒントを渡す
- スレッドの問題なしでセキュリティを設定し、設定を継承する
それらは同じハンドル タイプを返しません。fopen/FILE オブジェクトを使用すると、fputs などの他のランタイム関数を呼び出すことができます (「ネイティブ」ファイル ハンドルに変換するだけでなく)。
可能な限り、fstream や boost ファイル IO オブジェクトなど、RAII をサポートするオブジェクト指向のラッパーを優先してください。
もちろん、共有モードに注意する必要があるため、fopen() と STL では不十分です。