【问题标题】:Using CreateFile to check exclusive write access使用 CreateFile 检查独占写入权限
【发布时间】:2014-04-15 23:53:52
【问题描述】:

我需要检查文件的独占写访问权限。我输入了这段代码。

HANDLE fileH = CreateFile(filePath,
            GENERIC_READ | GENERIC_WRITE,
            0, // For Exclusive access
            0,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

if (fileH != INVALID_HANDLE_VALUE) {
    // We have exclusive write access.
    CloseHandle(fileH);
}
else {
    // No exclusive write access.
}

即使对于在其他地方以共享读取模式打开的文件,这也会导致文件被打开。虽然这是我想要的结果,但是 CreateFile API 的这种行为是否正确?或者我应该只指定 GENERIC_WRITE,而不是 (GENERIC_READ | GENERIC_WRITE)?

【问题讨论】:

  • 参考示例代码:INVALID_HANDLE_VALUE表示CreateFile操作失败。如果您正在检查独占写入访问权限,您应该测试:INVALID_HANDLE_VALUEGetLastError() == ERROR_SHARING_VIOLATION。否则,示例代码可能会产生误报。

标签: c++ windows winapi createfile


【解决方案1】:

如果你只想写访问,那么你也可以只指定GENERIC_WRITE

由于您指定要独占访问,因此如果打开文件的另一个句柄,该调用将失败。你说当另一个句柄存在FILE_SHARE_READ共享模式时函数调用成功。但是你错了。在这种情况下,您问题中对CreateFile 的调用会失败。


根据 cmets,听起来您希望打开文件以进行独占访问,同时其他方打开文件。这是不可能的。排他的意思是排斥所有其他人。当您以独占方式打开文件时,这意味着您的文件是该文件的唯一打开句柄。

【讨论】:

  • 我又查了一遍,没记错。 - 当文件在另一个应用程序实例中以共享读取模式打开时,如上所述调用的 CreateFile 不会失败。它的 Windows 8.1。我会检查 Windows 7 上的行为,或者首先在同一个应用实例中以共享读取模式打开。
  • 你说的是真的。当另一个文件句柄存在时,对 CreateFile 的独占访问调用确实会失败。为只读模式打开的句柄已关闭,因此我得到了错误的印象。即使文件在其他地方以共享只读模式打开,检查独占写入访问的正确方法是什么?
  • 调用 CreateFile 询问您需要的任何共享模式。如果调用成功,您就可以开始了。
  • 让我换种说法:如果有人拥有共享读取权限,难道不能获得独占写入权限吗?
  • 没有。排他的意思,嗯,排他的。排除所有其他人。
猜你喜欢
  • 2015-02-09
  • 2013-12-04
  • 2017-01-21
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2011-02-28
相关资源
最近更新 更多