检查文件是不是打开[重复]

Posted

技术标签:

【中文标题】检查文件是不是打开[重复]【英文标题】:Check if a file is open [duplicate]检查文件是否打开[重复] 【发布时间】:2011-02-28 13:49:19 【问题描述】:

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

【问题讨论】:

请提供更多细节。已经被您的进程或其他进程打开?打开期间,还是仅以写访问权限打开?分享呢?等等。这个问题太模糊了。 【参考方案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 中)。可以得到,但它是低级的,需要指定很多参数才能知道“打开”是什么意思。 这个答案与另一个问题的答案相同:(***.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)。这将允许您将异常管理放置在专门负责的类中并使其可重用。您甚至可以应用进一步的逻辑,例如测试文件大小以查看文件是否正在写入等,以提供更详细的响应。它还可以让你的消费代码更加简洁。

【讨论】:

以上是关于检查文件是不是打开[重复]的主要内容,如果未能解决你的问题,请参考以下文章

检查文件是不是被使用[重复]

检查文件夹中是不是存在文件[重复]

检查vb中是不是存在文件[重复]

如何检查文件是不是被git忽略[重复]

检查特定文件夹中是不是已存在文件[重复]

始终完全打开文档[重复]