2

こんにちは、ファイル全体をメモリにロードせずにファイルのバイトを逆にしようとしています。私がこれまでに持っているものです:

        FileStream fileStream = new FileStream("file.txt", FileMode.Open, FileAccess.ReadWrite);
        fileStream.Seek(1024, SeekOrigin.End);
        byte[] buffer = new byte[1024];
        int count;
        while (fileStream.Position != 0)
        {
            count = fileStream.Read(buffer, 0, 1024);

        }

ファイルのバイトの順序を逆にして、逆の順序で保存するにはどうすればよいですか?

4

2 に答える 2

4

最後のブロックから始めて、各ブロックを読み取り、それらのバイトを逆の順序で書き込むことで、ファイルをブロック単位で読み取るのが最善だと思います。

例:

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 つの方法を相互に測定してみてください。ファイルが大きく、バッファが小さい場合、ブロックごとの方法では多くのファイル シークが必要になります。一方、メモリ マップト ファイルの設定にはオーバーヘッドが発生します。

于 2013-04-06T13:56:38.983 に答える