ファイルを開く前にファイルのハンドルを開く必要があります。ファイルが別のエンティティによって既に開かれているかどうかを確認する必要があります。私は既に存在する場合、ファイルを開くためにCREATE_NEWパラメータが失敗したと読んでいます。 CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
WindowsのCreateFile関数で既にファイルが開いていることを確認する方法
もう1つのエンティティがすでにファイルを開いていますが、上記のAPIを呼び出すことで同じファイルを開くと、適切なハンドルが返され、getLastError()でもSUCCESSが返されます。しかし、期待はFAILUREを返すべきです。
なぜ気になりますか?必要なアクセスと共有モードでファイルを開き、ファイルを開くことができない場合に備えて適切なエラー処理を実装します。これにより、潜在的な[TOCTTOU](https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use)競合状態も取り除かれます。 – IInspectable
'CREATE_NEW'でファイルを開くと、ファイル自体が存在するかどうか(' CreateFile() 'は' ERROR_FILE_EXISTS'エラーで失敗します)が表示されます。 'dwDesiredAccess'と' dwShareMode'の組み合わせは、 'dwCreationDisposition'ではなく、それを決定します。 'dwShareMode'を0に設定すると、ファイルがすでに開いている場合には' ERROR_SHARING_VIOLATION'エラーが発生します。 –
開いているファイルをチェックするだけで、実際にファイルを開く必要がない場合は、代わりに['IFileIsInUse'](https://msdn.microsoft.com/en-us/)を使用してみてください。私たち/ライブラリ/ windows/desktop/bb775874.aspx) 'CreateFile()'の代わりに。 –