2016-07-05 37 views
0

在打开文件之前,我必须打开文件的句柄,我需要检查文件是否已被其他实体打开。如果已经存在,我读取CREATE_NEW参数无法打开文件。我打开文件使用api和参数CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);如何检查文件已在Windows的CreateFile函数中打开

另一个实体已经打开该文件,但当我尝试通过调用上述api打开相同的文件它会返回一个合适的句柄,甚至getLastError()返回成功。但期望是失败应退还。

+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/library/windows/desktop/bb775874.aspx)接口而不是'CreateFile()'。 –

回答

2

您可以尝试以独占模式打开文件。如果你能够做到这一点,那么这意味着它没有被另一个进程使用,否则它正在被使用。

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

,当设置为0,将意味着它是独占访问的dwShareMode。 MSDN says:

如果这个参数是零和的CreateFile成功,文件或设备 不能被共享和被关闭不能再次打开,直到手柄将 文件或设备。

+0

是的,即使我试图用Exclusing模式打开。但我无法找到任何参数以独占模式打开文件。你可以请分享一个代码片段! – user3201343

+1

设置为零的'dwShareMode'是独占访问。 – cdarke

4

您的代码已经正确。您正在通过0作为以独占访问方式打开文件的共享模式。在处理生命期间没有其他方可以打开文件。

的文件说,这大约独占共享模式:

从打开文件或设备,如果他们要求删除,读取或写入访问防止其它进程。

从这一切的合乎逻辑的结论是,你错误地认为当你拨打CreateFile时另一方有文件打开。如果你在问题中报告的内容是正确的,那就不对了。

相关问题