0

バイナリファイルを読んでいて、何かが起こるのを待っている間、プログラムが何もしていないことに気づきました。

実行中のある時点でスタックしているように見えました。コンソールにいくつかのprintステートメントを追加しましたが、特定のポイントに到達していることがわかります...しかし、続行したくないようです。これは、コードの最初の数行です。

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ましたが、元のファイルと同じであったため、有効なストリームである必要があります。

この問題のデバッグを続行する方法がわかりません。誰かが同様の問題に遭遇しましたか?

編集:申し訳ありませんが、私はさまざまな方法の断片を投稿していました。これが全体の方法です

4

2 に答える 2

2

usingブロックを離れると、MemoryStreamは破棄され、BinaryReader無効になります。メモリストリームを破棄すると、バイナリリーダーの下から敷物が引き出されます。可能であれば、関連するすべての読み取りコードをusingブロックに移動し、BinaryReader同様に1つにラップします。

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

すべてを読み込んで。を介してフィードする理由がない限り、ファイルから直接読み取ることもできますMemoryStream

コードのレイアウトによってが使用できない場合は、およびオブジェクトをusing追跡して実装できます。次に、後でそれらに対してDispose`を呼び出してクリーンアップします。MemoryStreamBinaryReaderIDisposable

これを行わないと、ガベージコレクターは最終的Disposeにクリーンアップされますが、何かを呼び出すのIDisposableは良い習慣です。そうしないと、ファイルハンドルを開いたり、ファイナライザキューにGDIオブジェクトが配置されて破棄されるのを待っているという問題が発生する可能性があります。

于 2012-08-27T19:42:59.750 に答える
0

FileStreamも使用する代わりに、このようにBinaryReaderを使用してみてください(使用している場合)。
これが機能しない場合は、などの他のエンコーディングオプションを試してください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のように使用して、読み取り以外のモードでファイルにアクセスされる可能性を回避してください。

using (BinaryReader inFile = new BinaryReader(File.OpenRead(@"myFile.dat"),Encoding.Unicode))
于 2012-08-27T19:02:43.917 に答える