2

サイズが 10124 のファイルがあり、ファイルの先頭に長さ 4 のバイト配列を追加しています。その後、ファイルサイズは 10128 になるはずですが、ファイルに書き込んでいくうちに 22 バイトに減少しました。どこに問題があるのか​​わからない

public void AppendAllBytes(string path, byte[] bytes)
{
    var encryptedFile = new FileStream(path, FileMode.Open, FileAccess.Read);
    ////argument-checking here.
    Stream header = new MemoryStream(bytes);

    var result = new MemoryStream();
    header.CopyTo(result);
    encryptedFile.CopyTo(result);

    using (var writer = new StreamWriter(@"C:\\Users\\life.monkey\\Desktop\\B\\New folder (2)\\aaaaaaaaaaaaaaaaaaaaaaaaaaa.docx.aef"))
    {
        writer.Write(result);
    }
}

ファイルにバイトを書き込むにはどうすればよいですか?

4

1 に答える 1

2

この問題は次の原因で発生しているようです。

  • を使用しStreamWriterてバイナリ形式のデータを書き込みます。名前からは直感的にはわかりませんが、このStreamWriterクラスはテキスト データの書き込みに適しています。

  • 実際のバイナリ データの代わりにストリーム全体を渡します。に格納されているバイトを取得するにはMemoryStream、その便利ToArray()なメソッドを使用します。

次のコードをお勧めします。

public void AppendAllBytes(string path, byte[] bytes)
{
    var fileName = @"C:\\Users\\life.monkey\\Desktop\\B\\New folder (2)\\aaaaaaaaaaaaaaaaaaaaaaaaaaa.docx.aef";

    using (var encryptedFile = new FileStream(path, FileMode.Open, FileAccess.Read))
    using (var writer = new BinaryWriter(File.Open(fileName, FileMode.Append)))
    using (var result = new MemoryStream())
    {
        encryptedFile.CopyTo(result);
        result.Flush(); // ensure header is entirely written.

        // write header directly, no need to put it in a memory stream
        writer.Write(bytes);
        writer.Flush(); // ensure the header is written to the result stream.
        writer.Write(result.ToArray());
        writer.Flush(); // ensure the encryptdFile is written to the result stream.
    }
}

上記のコードは、BinaryWriterバイナリ データにより適したクラスを使用しています。Write(byte[] bytes)配列全体をファイルに書き込むために上記で使用されているメソッド オーバーロードがあります。このコードでは、Flush()メソッドの定期的な呼び出しを使用しますが、これは必要ないと考える人もいますが、これらは一般に、Flush()メソッドの呼び出しの前に書き込まれたすべてのデータがストリーム内に永続化されることを保証します。

于 2013-12-11T10:42:26.520 に答える