我在windows中使用_findfirst
函数打开文件,但我只想打开未被其他进程打开的文件。情况是,我将扫描一个目录读取文件并删除它们,而其他进程在其中创建新文件。如何检测文件是否被窗口中的其他进程打开
为了避免竞争条件,我发现这question其中提到了用no sharing
选项打开文件的可能性。但是,这是如何完成的?
更新:我无法控制写入过程,因此在创建文件时不知道哪些标志(如果不是)。此外,写作过程可能会改变(第三方软件)。
我在windows中使用_findfirst
函数打开文件,但我只想打开未被其他进程打开的文件。情况是,我将扫描一个目录读取文件并删除它们,而其他进程在其中创建新文件。如何检测文件是否被窗口中的其他进程打开
为了避免竞争条件,我发现这question其中提到了用no sharing
选项打开文件的可能性。但是,这是如何完成的?
更新:我无法控制写入过程,因此在创建文件时不知道哪些标志(如果不是)。此外,写作过程可能会改变(第三方软件)。
致电OpenFile和uStyle
(第三参数)至少加上OF_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);
假设你的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
我无法控制写作过程,这是否仍然成立? –
然后取决于写入过程是否打开,不共享......如果你可以让写入过程创建一个巨大的文件,那么你可以测试这种情况...如果不是,也许IFileIsInUse可以帮助。我已经看到一些讨论Windows Shell的IFileIsInUse接口的线程,但是我没有找到任何好的代码示例,我从来没有使用它... –
找到打开文件进行写入和捕获异常 –
如果该文件是由另一个进程打开,然后'DeleteFile'只会失败,这不应导致竞争状态。除非另一个进程使用'FILE_SHARE_DELETE'标志创建文件(这不太可能)。在你的问题中没有足够的信息... –
@BarmakShemirani,我更新了我的问题,还有其他必需/有用的信息吗? –