Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在windows中检测文件是否被其他进程打开_C++_C_Windows - Fatal编程技术网

C++ 如何在windows中检测文件是否被其他进程打开

C++ 如何在windows中检测文件是否被其他进程打开,c++,c,windows,C++,C,Windows,我正在使用windows中的\u findfirst功能打开文件,但我只想打开其他进程未打开的文件。情况是,我将扫描一个目录,读取文件并删除它们,而其他进程将在其中创建新文件 为了避免竞争条件,我发现了这一点,其中提到了使用无共享选项打开文件的可能性。但这是怎么做到的呢 更新:我无法控制写入过程,因此不知道在创建文件时使用了哪些标志(如果不是)。此外,写入过程可能会更改(第三方软件)。调用并作为uStyle(第三个参数)添加至少的_SHARE_EXCLUSIVE要打开没有共享选项的文件,您可以使

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

为了避免竞争条件,我发现了这一点,其中提到了使用
无共享
选项打开文件的可能性。但这是怎么做到的呢


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

调用并作为
uStyle
(第三个参数)添加至少
的_SHARE_EXCLUSIVE
要打开没有共享选项的文件,您可以使用

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);

假设只有您的两个进程会打开文件,则从:

通过在写入过程中使用此选项,您可以在读取过程中检查无效的\u HANDLE\u值,在这种情况下,如果GetLastError()返回错误\u SHARING\u违例,那么您就知道您的文件是由另一个没有共享的过程打开的


有关更多详细信息,请参见

打开文件进行写入并捕获例外情况如果文件被另一个进程打开,则删除文件将失败,这不应导致争用情况。除非另一个进程正在创建带有
file\u SHARE\u DELETE
标志的文件(不太可能)。你的问题中没有足够的信息…@BarmakShemirani,我已经更新了我的问题,还有更多需要/有用的信息吗?我无法控制写作过程,这是否仍然有效?然后取决于写作过程是否在没有共享的情况下打开。。。如果您可以让编写过程创建一个巨大的文件,那么您可以测试这个案例。。。如果不是的话,也许我可以帮忙。我看到一些线程在讨论Windows Shell中的iFleiSinuse接口,但我没有找到任何好的代码示例,我也从未使用过它。。。
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