如何配置File.OpenRead()

时间:2011-03-28 16:39:44

标签: c# dispose

如何正确处理File.OpenRead()。我目前正在使用以下代码?

using (BinaryReader br = new BinaryReader(File.OpenRead(path)))
{
   myByte = br.ReadByte();
}

在分析代码时,我在Visual Studio中得到以下内容:

  

警告1 CA2000:   Microsoft.Reliability:方法   'Program.Main(string [])',对象   'File.OpenRead(path)'未被处理   沿着所有异常路径。呼叫   System.IDisposable.Dispose on object   'File.OpenRead(path)'之前   对它的引用超出了范围。

4 个答案:

答案 0 :(得分:16)

乍一看,这看起来像是误报,因为处置BinaryReader也会处理FileStream返回的File.OpenRead

来自:http://msdn.microsoft.com/en-us/library/azy2k2bx.aspx

  

当disposing参数为true时,此方法释放此BinaryReader引用的任何托管对象所拥有的所有资源。此方法调用每个引用对象的Dispose方法。

但是,有一个极端情况,FileStream实际上没有处理:当BinaryReader的构造函数抛出异常时!

<强>解决方案:
编写代码的正确方法如下:

using (var fs = File.OpenRead(path))
{
    BinaryReader br = new BinaryReader(fs);
    myByte = br.ReadByte();
}

背景:
BinaryReader仅包含对FileStream的引用,因此无需处理 Code Analysis赞同这一观点。


BTW:将此解决方案用于可写流时,在处理流之前刷新写入器非常重要:

using (var fileStream = new FileStream(...))
{
    var writer = new StreamWriter(fileStream);

    writer.WriteLine(...);

    writer.Flush(); // <-- Important
}

如果您忘记了这一点,您的信息流可能不包含使用StreamWriter编写的所有内容。

答案 1 :(得分:3)

如何:

using (Filestream fs = File.OpenRead(Path))
{
    using (BinaryReader br = new BinaryReader(fs))
    {
        myByte = br.ReadByte();
    }
}

答案 2 :(得分:0)

File.OpenRead返回一个FileStream,它也是IDisposible。如果您愿意,可以将它放在外部使用块中,或者声明它并将其置于当前使用之外。

答案 3 :(得分:0)

由File.OpenRead创建的FileStream和您在该FileStream上创建的BinaryReader都需要被处理掉,因此您需要对每个文件进行显式引用:

using(FileStream fs = File.OpenRead(path))
using(BinaryReader br = new BinaryReader(fs))
{
   myByte = br.ReadByte();
}