2016-07-05 47 views
0

ファイルを開く前にファイルのハンドルを開く必要があります。ファイルが別のエンティティによって既に開かれているかどうかを確認する必要があります。私は既に存在する場合、ファイルを開くためにCREATE_NEWパラメータが失敗したと読んでいます。 CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);WindowsのCreateFile関数で既にファイルが開いていることを確認する方法

もう1つのエンティティがすでにファイルを開いていますが、上記のAPIを呼び出すことで同じファイルを開くと、適切なハンドルが返され、getLastError()でもSUCCESSが返されます。しかし、期待はFAILUREを返すべきです。

+1

なぜ気になりますか?必要なアクセスと共有モードでファイルを開き、ファイルを開くことができない場合に備えて適切なエラー処理を実装します。これにより、潜在的な[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)競合状態も取り除かれます。 – IInspectable

+0

'CREATE_NEW'でファイルを開くと、ファイル自体が存在するかどうか(' CreateFile() 'は' ERROR_FILE_EXISTS'エラーで失敗します)が表示されます。 'dwDesiredAccess'と' dwShareMode'の組み合わせは、 'dwCreationDisposition'ではなく、それを決定します。 'dwShareMode'を0に設定すると、ファイルがすでに開いている場合には' ERROR_SHARING_VIOLATION'エラーが発生します。 –

+1

開いているファイルをチェックするだけで、実際にファイルを開く必要がない場合は、代わりに['IFileIsInUse'](https://msdn.microsoft.com/en-us/)を使用してみてください。私たち/ライブラリ/ windows/desktop/bb775874.aspx) 'CreateFile()'の代わりに。 –

答えて

2

排他モードでファイルを開こうとすることができます。もしあなたがそれを行うことができれば、他のプロセスによって使用されていないことを意味します。

CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 

dwShareModeは、0に設定すると排他的アクセスを意味します。 MSDN says:

このパラメータがゼロであるとのCreateFileが成功すると、ファイルまたはデバイス を共有することはできませんし、 ファイルまたはデバイスへのハンドルが閉じられるまで、再び開くことができません。

+0

はい、私はExclusingモードで開こうとしました。 Exclusiveモードでファイルを開くためのパラメータは見つかりませんでした。コードスニペットを共有していただけますか? – user3201343

+1

'dwShareMode'が0に設定されているのは排他アクセスです。 – cdarke

4

コードはすでに正しいです。排他的アクセスでファイルを開く共有モードとして0を渡しています。それが処理されている間に他のパーティーがファイルを開くことはできません。

彼らは、削除、読み取り、または書き込みアクセスを要求した場合、ファイルやデバイスを開くことから、他のプロセスを防ぎ:

ドキュメントには、このことについて排他共有モードは述べています。

CreateFileに電話すると、他の当事者がファイルを開いていると誤解されることがあります。あなたが質問で報告するものが正しい場合、それは真実ではありません。

関連する問題