检查是否可以读取文件

时间:2013-06-26 11:17:48

标签: c# file-io io

这就是我试图检查是否可以在实际阅读之前阅读该文件的方法

FileStream stream = new FileStream();
try
{
   // try to open the file to check if we can access it for read
   stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
}
catch (IOException ex)
{
   return false;
}
finally
{
   stream.Dispose();
}

这是正确的方法吗?

同样File.OpenFile.ReadAllText相似,我的意思是,它们的性能同样昂贵吗?

3 个答案:

答案 0 :(得分:5)

是否可以读取文件取决于许多因素:您是否拥有权限,硬盘是否已损坏。我可能和你一样走了相同的路线。

但是,您必须记住,从此方法获得的信息只是一个快照。如果在调用此方法后立即更改了文件的权限,则稍后在代码中访问该文件仍将失败。你不应该依赖这种方法的结果。

只是一个建议,以下代码执行相同但更简洁:

try
{
    File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read).Dispose();
    return true;
}
catch (IOException)
{
    return false;
}

由于您并未真正使用该流,因此您不必保留对它的引用。相反,您可以通过调用File.Open()的结果上的dispose来立即处理流。

修改

请参阅https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8,了解为何我将Dispose()放在File.Open()的末尾,而不是使用using语句。

答案 1 :(得分:4)

如果您想检查例外,只需在Dan Dinu代码中添加适当的try..catch,例如

  try {
    using (FileStream stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read)) {
      ... // <- Do something with the opened file
      return true; // <- File has been opened
    }
  }
  catch (IOException) {
    return false; // <- File failed to open
  }

答案 2 :(得分:-1)

你的解决方案看起来很好。您还可以使用“使用”声明:

using (FileStream stream = new FileStream()) 
{
       try {
       stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
       }
        catch { return false; }
}

编译器将其转换为try / finally块,并在执行块代码后自动处理对象。

文件打开仅打开文件进行读/写。

ReadAllText打开文件读取文本并将其关闭,因此需要更长的时间。它取决于你选择适合你的情况的方法。