程序似乎不想从文件中读取

时间:2012-08-27 18:35:35

标签: c# winforms

我正在读一个二进制文件,在等待某事发生的时候,我注意到该程序没有做任何事情。

它似乎停留在执行中的某一点。我在一些打印语句中添加了控制台,并且可以看到它到达某个点......但是似乎并不想继续。这是前几行代码:

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的内容转储到一个新文件中,它与原始文件相同,因此它应该是一个有效的流。

我不确定如何继续调试此问题。有人遇到过类似的问题吗?

编辑:对不起,我发布了不同方法的点点滴滴。这是整个方法

2 个答案:

答案 0 :(得分:2)

离开using阻止后,MemoryStream被处理掉,导致BinaryReader无效。丢弃内存流正在从二进制阅读器下面拉出地毯。如果可以,将所有相关阅读代码移动到使用块中,并将BinaryReader包装在一个中。

using (var ms = new MemoryStream(File.ReadAllBytes(path)))
using (var inFile = new BinaryReader(ms))
{
    inFile.ReadInt32();
}

您也可以直接从该文件中阅读,除非您有理由全部阅读并通过MemoryStream提供。

如果您的代码布局方式使您无法使用using,那么您可以跟踪MemoryStreamBinaryReader对象并实施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))