gpt4 book ai didi

c++ - CreateFile dwDesiredAccess 和 dwShareMode 组合

转载 作者:行者123 更新时间:2023-11-30 03:40:26 25 4
gpt4 key购买 nike

我试图在 Windows 上用 C++ 实现 checkAccess() 方法,并想使用 CreateFile() 方法。访问模式是存在、读取和写入。对于以下这 3 个,我建议使用 dwDesiredAccessdwShareMode 组合:

mode          dwDesiredAccess          dwShareMode
existence: 0 FILE_SHARE_READ | FILE_SHARE_WRITE
read GENERIC_READ FILE_SHARE_READ
write GENERIC_WRITE FILE_SHARE_WRITE

这些组合准确吗?

在测试组合时我注意到如果我调用

CreateFile(file,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL)

在一个文件上再次对同一个文件调用相同的方法,但我只传递了 GENERIC_READFILE_SHARE_READ,第二次调用失败了。为什么第二次调用失败?文档说不能冲突的模式。第二个调用是第一个调用的子集,因此没有冲突。

调用失败并出现错误 32:ERROR_SHARING_VIOLATION

最佳答案

Are these combinations accurate?

我可能会改用这些:

mode          dwDesiredAccess    dwShareMode--------------------------------------------existence:    0                  FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETEread          GENERIC_READ       FILE_SHARE_READ | FILE_SHARE_WRITEwrite         GENERIC_WRITE      FILE_SHARE_READ

检查是否存在应该允许其他进程以任何访问权限打开文件。

打开文件进行只读访问不应阻止其他进程打开同一文件进行写入。

打开文件进行只写访问应该可以防止其他进程打开同一文件进行写入。您不希望它们同时相互覆盖。但是您应该允许其他进程读取正在写入的内容。

想想需要读取/写入实时数据的应用,例如日志生成器和日志查看器。

顺便说一句,使用 FindFirstFile()GetFileAttributes/Ex() 可以更好地实现您的 existence 检查,这样您就可以查询有关文件的元数据(如果文件不存在,这将失败)而不必实际打开文件本身,因此共享权限将无关紧要。如果您选择使用 CreateFile() 进行 existence 检查,请确保您没有将 ERROR_SHARING_VIOLATION 视为错误,因为它是隐式的告诉您该文件确实存在,您只是无法打开它。

Why is the second call failing?

因为第二次调用只授予读取共享,这意味着允许同一文件的其他句柄打开文件以进行读取但不允许写入,但是第一个句柄已经打开以进行写入,因此第二次调用不能满足和失败。

The second call is a subset of the first call so there's no conflict.

是的,有冲突。

关于c++ - CreateFile dwDesiredAccess 和 dwShareMode 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com