检查文件是不是打开[重复]
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)。这将允许您将异常管理放置在专门负责的类中并使其可重用。您甚至可以应用进一步的逻辑,例如测试文件大小以查看文件是否正在写入等,以提供更详细的响应。它还可以让你的消费代码更加简洁。
【讨论】:
以上是关于检查文件是不是打开[重复]的主要内容,如果未能解决你的问题,请参考以下文章