3

私は一般的にプログラミングに不慣れです(プログラミングの概念についての私の理解はまだ成長しています)。ですから、この質問は学習に関するものですので、私が学ぶのに十分な情報を提供してください。ただし、私ができないほど多くはありません。ありがとうございます。(プロジェクトでコードを再利用可能にする方法についても入力してください。)

私が取り組んでいるプロジェクトの目標は次のとおりです。

  1. バイナリファイルを読み取ります。

  2. このファイル内から特定のデータチャンクを見つけるために読み取る必要のあるオフセットを知っています。

  3. 最初のオフセットは最初の4バイトです(私のチャンクの終わりのオフセット)。

  4. 2番目のオフセットは、ファイルの終わりから16バイトです。私は4バイトを読みました(16進数でチャンクのサイズを示します)。

  5. 3番目のオフセットは、前の4バイトに続く4バイトで、4バイトで読み取られます(16進数のチャンクの開始のオフセット)。

  6. ASCIIテキストとオフセットを検索して、変更するチャンク内のパーツを見つけます。

これで、チャンクの開始オフセット、終了オフセット、およびサイズがわかりました。これにより、ファイルからバイト配列にバイトを読み取り、配列のサイズを事前に知ることができます。

(質問:1。サイズを知ることは重要ですか?検証以外です。2。バイトを変更してファイルのその部分を上書きするために、ファイルの一部をバイト配列に読み込むのが最善の方法ですか?)

これまでのところ、MemoryStreamでBinaryReaderを使用してファイルからオフセットを読み取ることができました。次に、必要なデータのチャンクを見つけて、それをバイト配列に読み込みます。

私はいくつかの方法で立ち往生しています:

  • バイナリ読み取り/書き込みのベストプラクティスは何ですか?
  • 読み取られるデータの最適なストレージ規則は何ですか?
  • バイトを変更する必要がある場合、どうすればよいですか。
  • FileStreamを使用する必要がありますか?
4

1 に答える 1

3

読み取りと書き込みの両方が必要なため、FileStreamクラスを直接使用するのが理にかなっています(FileMode.OpenとFileAccess.ReadWriteを使用)。全体的な良い例については、MSDNのFileStreamを参照してください。

  1. ストリームから読み取るバイト数を知る必要があります。FileStream.Readのドキュメントを参照してください。
  2. 基本的に、バイトを使用して後でその内容を変更する場合は、ある時点でバイトをメモリに読み込む必要がありますしたがって、メモリ内のコピーを作成する必要があります(一度に可変長のチャンクを読み取る場合は、Readメソッドを使用するのが正しい方法です)。

ベストプラクティスとしては、完了したら常にストリームを破棄してください。例えば:

using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
    //Do work with the FileStream here.
}

大量の作業を行う場合は、非同期で作業を行う必要があります。(その場合はお知らせください。)

そしてもちろん、これらのメソッドを使用する前に、 FileStream.ReadドキュメントとFileStream.Writeドキュメントを確認してください。

バイトの読み取りは、読み取る長さのバイトのメモリ内配列を事前に割り当ててから、それらのバイトを読み取ることによって行うのが最適です。以下は、関心のあるバイトのチャンクを読み取り、それを処理してから、元の内容を置き換えます(チャンクの長さが変更されていないことを前提としています)。

編集:変数スコープのコメントに従って、チャンクで作業を行うためのヘルパーメソッドを追加しました。

using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
    var chunk = new byte[numOfBytesInChunk];
    var offsetOfChunkInFile = stream.Position; // It sounds like you've already calculated this.
    stream.Read(chunk, 0, numOfBytesInChunk);

    DoWorkOnChunk(ref chunk);        

    stream.Seek(offsetOfChunkInFile, SeekOrigin.Begin);
    stream.Write(chunk, 0, numOfBytesInChunk);
}

private void DoWorkOnChunk(ref byte[] chunk)
{
    //TODO: Any mutation done here to the data in 'chunk' will be written out to the stream.
}
于 2012-06-07T23:20:35.053 に答える