检查文件是否已打开

时间:2010-06-07 06:49:48

标签: c# windows file-io io

有没有办法找到文件是否已经打开?

4 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:7)

作为@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;
}

答案 2 :(得分:1)

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

此外,当你得到它时,信息会很旧。即使测试会返回文件未打开,也可能在您有机会使用返回值之前打开它。

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

答案 3 :(得分:0)

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