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