如何检测文件是否被Windows中的其他进程打开

时间:2016-09-20 08:36:44

标签: c++ c windows

我在Windows中使用_findfirst功能打开文件,但我只想打开其他进程未打开的文件。情况是我将扫描目录读取文件并删除它们,而其他进程在其中创建新文件。

为避免竞争条件,我发现此question提到了使用no sharing选项打开文件的可能性。但那是怎么做到的?

更新:我无法控制写入过程,因此在创建文件时不知道是否使用了哪些标志。此外,写作过程可能会改变(第三方软件)。

3 个答案:

答案 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)

致电OpenFileuStyle(第三次参考)至少添加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);