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