11

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

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.Open类似于File.ReadAllText,我的意思是,它们的性能是否同样昂贵?

4

3 回答 3

8

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

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

只是一个建议,以下代码的作用相同,但更简洁一些:

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

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

编辑:

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

于 2013-06-26T11:25:15.797 回答
4

If you want to check for exceptions, just add appropriate try..catch to Dan Dinu code e.g.

  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
  }
于 2013-06-26T11:40:51.830 回答
-1

你的解决方案看起来不错。您还可以使用“使用”语句:

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

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

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

ReadAllText 打开文件读取文本并关闭它,因此需要更长的时间。由您来选择适合您情况的方法。

于 2013-06-26T11:25:01.203 回答