如何正确处理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)'之前 对它的引用超出了范围。
答案 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();
}