我在Windows中使用_findfirst
功能打开文件,但我只想打开其他进程未打开的文件。情况是我将扫描目录读取文件并删除它们,而其他进程在其中创建新文件。
为避免竞争条件,我发现此question提到了使用no sharing
选项打开文件的可能性。但那是怎么做到的?
更新:我无法控制写入过程,因此在创建文件时不知道是否使用了哪些标志。此外,写作过程可能会改变(第三方软件)。
答案 0 :(得分:2)
假设您的2个进程是唯一可以打开文件的进程,来自MSDN open sample:
hFile = CreateFile(argv[1], // name of the write
GENERIC_WRITE, // open for writing
0, // *** do not share ***
NULL, // default security
CREATE_NEW, // create new file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
通过在编写过程中使用它,您可以在读取过程中检查INVALID_HANDLE_VALUE,在这种情况下,如果GetLastError()返回ERROR_SHARING_VIOLATION,那么您知道您的文件是由另一个没有共享的进程打开的。
更多详情可在CreateFile documentation
中找到答案 1 :(得分:1)
致电OpenFile,uStyle
(第三次参考)至少添加OF_SHARE_EXCLUSIVE
。
答案 2 :(得分:1)
打开没有共享选项的文件,可以使用
HANDLE hFile = CreateFile("somFileName",
GENERIC_WRITE,
0, /*no sharing; other options are FILE_SHARE_READ, FILE_SHARE_WRITE etc*/
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);