10

違いは何ですか?また、どのような場合に、どちらか一方が何らかの点で優れていることが証明されますか?

4

4 に答える 4

10

まず第一に、この関数fopenはファイルを使用した単純な移植操作にのみ使用できます。

CreateFile反対側では、ファイルの操作だけでなく、ディレクトリ (対応するオプションを使用)、パイプ、およびさまざまな Windows デバイスの操作にも使用できます。

CreateFileFILE_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も開くことができます。

ファイルのコンテンツを読み取るだけの場合はCreateFileCreateFileMappingとを使用MapViewOfFileしてファイル マッピングを作成できます。次に、ファイルをメモリ ブロックと同じように操作できるため、アプリケーションの速度が向上する可能性があります。

この関数には他にも使用方法があり、対応する MSDN の記事で詳しく説明されています。

要約すると、移植性の要件が厳しい場合、または aFILE*を外部ライブラリに渡す必要がある場合にのみ、 を使用する必要がありますfopen。それ以外の場合は、 を使用することをお勧めしますCreateFile。最良の結果を得るには、特に Windows API を学習することをお勧めします。これは、適切な用途を見つけることができる多くの機能があるためです。

UPDATED : 質問とは直接関係ありませんが、Windows Vista 以降でサポートされているトランザクション I/O機能を一瞥することもお勧めします。この機能を使用すると、中断できない 1 つのトランザクションとして、ファイル、ディレクトリ、またはレジストリを使用して一連の操作をコミットできます。これは非常に強力で興味深いツールです。トランザクション I/O 関数を使用する準備ができていない場合は、CreateFile後でトランザクション I/O にアプリケーションを移植して開始できます。

于 2010-06-14T16:27:35.640 に答える
5

それは、あなたが書いているプログラムのタイプに本当に依存します。携帯性があればfopen、生活が楽になります。「舞台裏」fopenと呼びます。CreateFile

FILEより高度なオプション (キャッシュ制御、ファイル アクセス制御など) は、Win32 API を使用している場合にのみ使用できます ( stdioのポインターではなく、Win32 ファイル ハンドルに依存します)。アプリケーションでは、CreateFile を使用することをお勧めします。

于 2010-06-14T15:00:55.380 に答える
1

CreateFile を使用すると、

  • 非同期 I/O 用にファイルを開く
  • FILE_FLAG_SEQUENTIAL_SCAN などの最適化のヒントを渡す
  • スレッドの問題なしでセキュリティを設定し、設定を継承する

それらは同じハンドル タイプを返しません。fopen/FILE オブジェクトを使用すると、fputs などの他のランタイム関数を呼び出すことができます (「ネイティブ」ファイル ハンドルに変換するだけでなく)。

于 2010-06-14T15:08:48.957 に答える
0

可能な限り、fstream や boost ファイル IO オブジェクトなど、RAII をサポートするオブジェクト指向のラッパーを優先してください。

もちろん、共有モードに注意する必要があるため、fopen() と STL では不十分です。

于 2010-06-14T21:24:48.530 に答える