我正在读一个二进制文件,在等待某事发生的时候,我注意到该程序没有做任何事情。
它似乎停留在执行中的某一点。我在一些打印语句中添加了控制台,并且可以看到它到达某个点......但是似乎并不想继续。这是前几行代码:
private BinaryReader inFile;
public void Parser(string path)
{
byte[] newBytes;
newBytes = File.ReadAllBytes(path);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(newBytes, 0, newBytes.Length);
inFile = new BinaryReader(ms);
inFile.BaseStream.Seek(0, SeekOrigin.Begin);
}
}
public void ParseFile()
{
Console.WriteLine("parsing");
Console.WriteLine("get size to read"); // prints this out
int sizeToRead = inFile.ReadInt32();
Console.WriteLine("Size: {0}", sizeToRead); // doesn't print this out
Console.WriteLine("Done"); // end file processing
}
当我注释掉阅读时,它运行正常。我将inFile
的内容转储到一个新文件中,它与原始文件相同,因此它应该是一个有效的流。
我不确定如何继续调试此问题。有人遇到过类似的问题吗?
编辑:对不起,我发布了不同方法的点点滴滴。这是整个方法答案 0 :(得分:2)
离开using
阻止后,MemoryStream
被处理掉,导致BinaryReader
无效。丢弃内存流正在从二进制阅读器下面拉出地毯。如果可以,将所有相关阅读代码移动到使用块中,并将BinaryReader
包装在一个中。
using (var ms = new MemoryStream(File.ReadAllBytes(path)))
using (var inFile = new BinaryReader(ms))
{
inFile.ReadInt32();
}
您也可以直接从该文件中阅读,除非您有理由全部阅读并通过MemoryStream
提供。
如果您的代码布局方式使您无法使用using
,那么您可以跟踪MemoryStream
和BinaryReader
对象并实施IDisposable
。然后在以后调用Dispose`进行清理。
如果你不这样做,垃圾收集器最终会清理 ,但是在Dispose
的任何地方调用IDisposable
都是很好的习惯。如果不这样做,您可能会遇到打开文件句柄或GDI对象的问题,这些对象位于等待处理的终结器队列中。
答案 1 :(得分:0)
尝试仅使用像这样的BinaryReader而不是使用FileStream(如果你的话)
如果这不起作用,请尝试其他编码选项,例如Encoding.Unicode
。
using (BinaryReader inFile = new BinaryReader(File.Open(@"myFile.dat", FileMode.Open),Encoding.ASCII))
{
int pos = 0;
int length = (int)inFile.BaseStream.Length;
int sizeToRead;
while (pos < length)
{
Console.WriteLine("get size to read"); // prints this out
sizeToRead = inFile.ReadInt32();
Console.WriteLine("Size: {0}", sizeToRead); // doesn't print this out, or anything after
}
Console.WriteLine("Done"); // end file processing
}
如果这不起作用,那么尝试使用这样的File.OpenRead
来避免在除Read之外的任何其他模式下访问文件的可能性:
using (BinaryReader inFile = new BinaryReader(File.OpenRead(@"myFile.dat"),Encoding.Unicode))