【问题标题】:Good and clean way to wait until the file closes [duplicate]等到文件关闭的良好而干净的方法[重复]
【发布时间】:2011-11-14 01:02:08
【问题描述】:

可能重复:
Wait until file is unlocked in .NET

我有一个打开的文件,例如 .Doc 或 .txt,我必须等到用户关闭它。 根据Wait until file is unlocked in .NET,我已经尝试过了:

while (true)
{
    try
    {
      using (FileStream Fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None, 100))
        {
            //the file is close
            break;
        }
    }
    catch (IOException)
    {
        //wait and retry
        Thread.Sleep(1000);
    }
}

这很好用,但有可能在没有 try/catch 和处理异常的情况下找到解决方案?

【问题讨论】:

  • 这是一个很好的问题。
  • 很遗憾,一般来说你不能。
  • 已经有一个问题 - 你甚至发布了一个链接 - 所以如果这是答案,那就是答案。不过,没有干净的方法真的太糟糕了。
  • 请注意,您有 2 个问题合而为一 - “当用户完成文件时”和“当文件不再被锁定时”。第二部分与另一个问题完全相同,第一个问题不适用于所有文件类型/应用程序对(即,如果像 Visual Studion 这样的应用程序打开文件并且不锁定文件,但让用户在需要时保存)。
  • 我很抱歉重复,但感谢您的评论和答案。现在我对这个概念有了更多的了解。

标签: c# .net file


【解决方案1】:

很遗憾没有,没有其他办法。

API 没有在文件解锁或其他任何方便的情况下触发的事件。

使用等待重试是当前 API 的最佳解决方案。

【讨论】:

  • 尽管您可能完全正确,但我仍然想知道 Mark Russinovich 的 Process Explorer 如何几乎实时地显示进程的打开句柄。它是否也通过频繁的轮询来做到这一点?我会尝试解决这个问题,如果我发现有用的东西,我会在这里发布我的答案。
  • @Igor - 他没有使用托管代码。我不知道 Windows API 暴露了什么(他可能正在使用 undocumented 功能)。
  • Sure Mark 正在使用低级非托管 API(甚至动态加载内核驱动程序!),但 OP 并没有说必须仅使用托管 API 来解决问题。对我(我敢打赌,对许多其他人来说也是如此)来说,如何在没有等待和循环的情况下做到这一点真的很有趣。
  • 您可以使用 Restart Manager API 来查找哪些进程正在锁定特定文件:msdn.microsoft.com/en-us/library/windows/desktop/… 但我认为它不允许监视文件锁定状态。
【解决方案2】:

不过,如果没有例外,请不要使用您现在拥有的循环 breaking - 在该 using 循环中执行您的实际文件访问。

接下来,如果文件在已知进程中打开,您可以获取其Process 对象,将EnableRaisingEvents 设置为true,并处理其Exited 事件以重试。但是,它不是故障安全的,因此您仍然可以处理异常并使用循环。

【讨论】:

    【解决方案3】:

    您可以对本机 CreateFile 函数进行 P/Invoke 调用,然后分析错误代码。但是,仍然需要 try/catch。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多