【问题标题】:How to detect if file is openned by other process in windows如何检测文件是否被Windows中的另一个进程打开
【发布时间】:2016-09-20 08:36:44
【问题描述】:

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

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

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

【问题讨论】:

  • 打开文件进行写入并捕获异常
  • 如果文件被另一个进程打开,那么DeleteFile 将简单地失败,它不应该导致竞争条件。除非其他进程正在创建带有FILE_SHARE_DELETE 标志的文件(这不太可能)。您的问题中没有足够的信息...
  • @BarmakShemirani,我更新了我的问题,还有需要/有用的信息吗?

标签: c++ c windows


【解决方案1】:

假设您的 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 接口,但我没有找到任何好的代码示例,而且我从未使用过它......
【解决方案2】:

调用OpenFile 并作为uStyle(第三个参数)添加至少OF_SHARE_EXCLUSIVE

【讨论】:

    【解决方案3】:

    要打开没有共享选项的文件,您可以使用

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

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2014-11-22
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多