【问题标题】:How can CreateFile fail with FILE_SHARE_READ and succeed with FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE?CreateFile 如何以 FILE_SHARE_READ 失败并以 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE 成功?
【发布时间】:2011-07-17 10:16:46
【问题描述】:

自己试试吧:

创建一个 XLS 文件,在 Excel 中打开它。

打开 sysinternals Process Monitor,观察在资源管理器中复制 XLS 文件时发生的情况(只需按 ctrl-c ctrl-v)。

连续两次调用::CreateProcess。第一次调用请求读取权限,并被拒绝访问。第二次调用要求读加写加删除并通过。

这正常吗?

【问题讨论】:

    标签: windows winapi file-io process


    【解决方案1】:

    您必须使用兼容的共享模式。如果 Excel 使用 FILE_SHARE_READ | 打开文件FILE_SHARE_WRITE 则随后打开文件的尝试必须至少使用相同的标志。具体来自MSDN documentation on CreateFile:

    您不能请求与具有打开句柄的现有请求中指定的访问模式冲突的共享模式。 CreateFile 将失败,GetLastError 函数将返回 ERROR_SHARING_VIOLATION。

    【讨论】:

      【解决方案2】:

      如果您使用FILE_SHARE_READ 打开文件,则表示您愿意共享对该文件的访问权限,但仅限于读取。

      如果您打开所有标志,您也愿意共享访问权限以进行写入/删除。

      FILE_SHARE_READ 比 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE 更严格

      如果其他进程 (excel) 已打开此文件,例如write(并且它设置了共享标志),您可以访问它的唯一方法是接受共享它以进行写入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多