Как прочитать все байты потока, кроме последних 8

У меня есть следующий код:

using (var fs = new FileStream(@"C:\dump.bin", FileMode.Create))
{
    income.CopyTo(fs);
}

income — это поток, который мне нужно сохранить на диск, проблема в том, что я хочу проигнорировать последние 8 байт и сохранить все до этого. Поток доходов доступен только для чтения, только для пересылки, поэтому я не могу предсказать его размер и не хочу загружать весь поток в память из-за отправляемых огромных файлов.

Любая помощь будет оценена.


person user3900456    schedule 01.08.2016    source источник
comment
Возможно, вы захотите попытаться протолкнуть его через очередь: прочитать кусок управляемого размера, поместить его в очередь, прочитать все, кроме 8 байтов из очереди, записать в выходной поток, повторить.   -  person n0rd    schedule 01.08.2016
comment
у вас есть пример кода?   -  person user3900456    schedule 01.08.2016


Ответы (1)


Может быть, (или, скорее, вероятно) есть более чистый способ сделать это, но, будучи прагматичным, в тот момент, когда мне приходит в голову первая мысль:

using (var fs = new FileStream(@"C:\dump.bin", FileMode.Create))
{
    income.CopyTo(fs);
    fs.SetLength(Math.Max(income.Length - 8, 0));
}

Который устанавливает длину файла после его записи.

person DAXaholic    schedule 01.08.2016
comment
будет ли это нормально с огромными файлами, например, 4 ГБ? - person user3900456; 01.08.2016
comment
Ну, изначально запись 8 байт «слишком много», когда речь идет о 4 ГБ, не должна быть проблемой, а обрезка файла с конца не требует полной перезаписи файла, поэтому с точки зрения производительности все должно быть в порядке. - person DAXaholic; 01.08.2016
comment
@user3900456 user3900456 Это лучший и самый эффективный способ удалить последние несколько символов из файла. Посмотрите здесь. - person ; 01.08.2016