最後のブロックから始めて、各ブロックを読み取り、それらのバイトを逆の順序で書き込むことで、ファイルをブロック単位で読み取るのが最善だと思います。
例:
MemoryStream output = new MemoryStream();
FileStream fs = new FileStream("D:\\file.txt", FileMode.Open);
long pos = fs.Length;
fs.Seek(0, SeekOrigin.End);
byte[] buffer = new byte[blockSize];
int length = blockSize;
while(pos > 0) {
length = (int)(pos < blockSize ? pos : blockSize);
pos -= length;
fs.Seek(pos, SeekOrigin.Begin);
int read = fs.Read(buffer,0, length);
byte[] reversed = buffer.Take(read).Reverse().ToArray();
output.Write(reversed,0, read);
}
length
例を単純にするために、ストリームが要求されたときに実際にバイトを読み取っていると仮定します。FileStream
はこれを行いますが、他のStream
実装の場合はそうではない場合があります (ネットワーク ストリームなど)。
別の回答で提案されているように、これにはメモリマップファイルを使用することもできます。.NET でメモリ マップド ファイルを使用する場合の正確なオーバーヘッドはわかりません。そのため、重要な場合は、処理する必要がある実際のファイル サイズを使用して、2 つの方法を相互に測定してみてください。ファイルが大きく、バッファが小さい場合、ブロックごとの方法では多くのファイル シークが必要になります。一方、メモリ マップト ファイルの設定にはオーバーヘッドが発生します。