有没有办法找到文件是否已经打开?
答案 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)。这将允许您将异常管理与专门负责的类放在一起,并使其可重用。您甚至可以应用其他逻辑,例如测试文件大小以查看文件是否正在写入等,以提供更详细的响应。它还可以使您的消费代码更加清晰。