【问题标题】:Check if a file is open [duplicate]检查文件是否打开[重复]
【发布时间】:2023-04-10 18:25:02
【问题描述】:

有没有办法查看文件是否已经打开?

【问题讨论】:

  • 请提供更多细节。已经被您的进程或其他进程打开?打开期间,还是仅以写访问权限打开?分享呢?等等。这个问题太模糊了。

标签: c# windows file-io io


【解决方案1】:
protected virtual bool IsFileinUse(FileInfo file)
{
     FileStream stream = null;

     try
     {
         stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
     }
     catch (IOException)
     {
         //the file is unavailable because it is:
         //still being written to
         //or being processed by another thread
         //or does not exist (has already been processed)
         return true;
     }
     finally
     {
         if (stream != null)
         stream.Close();
     }
     return false; 
}

【讨论】:

  • 如果进程没有对文件的写访问权限,这将产生误导性结果(打开将失败,但不一定因为存在句柄。)打开读取访问权限会更少错误-容易发生。
  • 令人惊讶的是,大多数语言都没有测试文件是否打开的方法。我们曾经在 OS/2 的 C++ 下使用相同类型的方法。即尝试以独占方式打开文件。它工作得很好,但我从没想过它很优雅。
  • 这不是语言功能,而是操作系统功能。只是不存在用于查询该信息的简单 API(在 Windows 中)。可以得到,但它是低级的,需要指定很多参数才能知道“打开”是什么意思。
  • 这个答案与另一个问题的答案相同:(stackoverflow.com/a/937558/38657)...也就是说,这是一个很好的答案。
  • 我刚刚测试了这个,在记事本中打开文本文件时没有抛出异常。
【解决方案2】:

作为@pranay rana,但我们需要确保关闭我们的文件句柄:

public bool IsFileInUse(string path)
{
  if (string.IsNullOrEmpty(path))
    throw new ArgumentException("'path' cannot be null or empty.", "path");

  try {
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
  } catch (IOException) {
    return true;
  }

  return false;
}

【讨论】:

  • 和@pranay rana一样,我测试了这个方法,但是它没有检测到文件何时在记事本中打开。
【解决方案3】:

如果您的意思是要在尝试打开文件之前检查文件是否已打开,则否。 (至少不是不去低级别检查系统中打开的每个文件句柄。)

此外,当您获得信息时,这些信息将是旧的。即使测试会返回文件未打开,它也可能在您有机会使用返回值之前打开。

因此,处理这种情况的正确方法是尝试打开文件,并处理可能发生的任何错误。

【讨论】:

    【解决方案4】:

    同意。我会创建一个指定的类来包装打开的文件逻辑或至少是测试(IsFileAvailable)。这将允许您将异常管理放置在专门负责的类中并使其可重用。您甚至可以应用进一步的逻辑,例如测试文件大小以查看文件是否正在写入等,以提供更详细的响应。它还可以让你的消费代码更加简洁。

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 2017-08-29
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多