2016-09-20 97 views
2

我在windows中使用_findfirst函数打开文件,但我只想打开未被其他进程打开的文件。情况是,我将扫描一个目录读取文件并删除它们,而其他进程在其中创建新文件。如何检测文件是否被窗口中的其他进程打开

为了避免竞争条件,我发现这question其中提到了用no sharing选项打开文件的可能性。但是,这是如何完成的?

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

+0

找到打开文件进行写入和捕获异常 –

+0

如果该文件是由另一个进程打开,然后'DeleteFile'只会失败,这不应导致竞争状态。除非另一个进程使用'FILE_SHARE_DELETE'标志创建文件(这不太可能)。在你的问题中没有足够的信息... –

+0

@BarmakShemirani,我更新了我的问题,还有其他必需/有用的信息吗? –

回答

1

致电OpenFileuStyle(第三参数)至少加上OF_SHARE_EXCLUSIVE

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

+0

我无法控制写作过程,这是否仍然成立? –

+0

然后取决于写入过程是否打开,不共享......如果你可以让写入过程创建一个巨大的文件,那么你可以测试这种情况...如果不是,也许IFileIsInUse可以帮助。我已经看到一些讨论Windows Shell的IFileIsInUse接口的线程,但是我没有找到任何好的代码示例,我从来没有使用它... –

相关问题