Я думаю, что вам лучше всего читать файл в блоках, начиная с последнего блока, считывая каждый блок и записывая эти байты в обратном порядке.
Пример:
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
реализаций они не могут (сетевые потоки и др.).
Для этого вы также можете использовать memory mapped file, как предлагается в другом ответе. Я не знаю точных накладных расходов на использование файлов с отображением памяти в .NET, поэтому, если это важно для вас, попробуйте измерить два метода друг против друга, используя фактический размер файла, который вам нужно обработать. Метод block by block включает в себя много файлов, если файл большой, а буфер невелик. С другой стороны, при настройке файла с отображением памяти будут накладные расходы.
Можете ли вы показать мне пример того, как я могу это достичь? – aleczandru
@lasseespeholt, да, это просто предназначалось для простого примера - это может быть поток файлов, сетевой поток или что-то еще. – driis