在打开文件之前,我必须打开文件的句柄,我需要检查文件是否已被其他实体打开。如果已经存在,我读取CREATE_NEW参数无法打开文件。我打开文件使用api和参数CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
如何检查文件已在Windows的CreateFile函数中打开
另一个实体已经打开该文件,但当我尝试通过调用上述api打开相同的文件它会返回一个合适的句柄,甚至getLastError()返回成功。但期望是失败应退还。
你为什么在意?使用所需的访问和共享模式打开文件,并在文件无法打开的情况下实施适当的错误处理。这也消除了潜在的[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/library/windows/desktop/bb775874.aspx)接口而不是'CreateFile()'。 –