如何检查文件已在Windows中的CreateFile函数中打开

时间:2016-07-05 06:49:34

标签: c file winapi createfile

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

打开文件

另一个实体已经打开了文件,但是当我尝试通过调用上面的api打开同一个文件时,它会返回一个正确的句柄,甚至getLastError()也会返回SUCCESS。但期望失败应归还。

2 个答案:

答案 0 :(得分:4)

您的代码已经正确无误。您正在传递0作为共享模式,该模式打开具有独占访问权限的文件。当该句柄存在时,没有其他方可以打开该文件。

文档说明了关于独占共享模式:

  

如果文件或设备请求删除,读取或写入访问权限,则阻止其他进程打开文件或设备。

所有这一切的逻辑结论是,当你打电话给CreateFile时,你错误地认为另一方打开了档案。如果您在问题中报告的内容是正确的,那就不是真的。

答案 1 :(得分:2)

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

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

dwShareMode设置为0时表示它是独占访问权限。 MSDN says:

  

如果此参数为零且CreateFile成功,则为文件或设备   无法共享,无法再次打开,直到句柄   文件或设备已关闭。