我必须打开文件句柄,在打开文件之前我需要检查文件是否已被其他实体打开。我读CREATE_NEW参数如果已经存在则无法打开文件。我正在使用api和参数CreateFile(file_name, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
另一个实体已经打开了文件,但是当我尝试通过调用上面的api打开同一个文件时,它会返回一个正确的句柄,甚至getLastError()也会返回SUCCESS。但期望失败应归还。
答案 0 :(得分:4)
您的代码已经正确无误。您正在传递0
作为共享模式,该模式打开具有独占访问权限的文件。当该句柄存在时,没有其他方可以打开该文件。
文档说明了关于独占共享模式:
如果文件或设备请求删除,读取或写入访问权限,则阻止其他进程打开文件或设备。
所有这一切的逻辑结论是,当你打电话给CreateFile
时,你错误地认为另一方打开了档案。如果您在问题中报告的内容是正确的,那就不是真的。
答案 1 :(得分:2)
您可以尝试以独占模式打开文件。如果你能够做到这一点,那就意味着它没有被其他进程使用,否则就会被使用。
CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
dwShareMode设置为0时表示它是独占访问权限。 MSDN says:
如果此参数为零且CreateFile成功,则为文件或设备 无法共享,无法再次打开,直到句柄 文件或设备已关闭。