Ну, по крайней мере, одна проблема заключается в том, что вы не учитываете «уже прочитанную часть», когда решаете, сколько читать. Попробуйте это:
int toRead = (int) Math.Min(pieceLenght - done, remaining);
А затем также отрегулируйте, где вы читаете в буфере:
int read = fin.Read(buffer, done, toRead);
(когда вы сбрасываете done
для нового буфера, но не offset
).
О, и в этот момент offset
не имеет значения, поэтому удалите его.
Затем обратите внимание и на ответ djna - рассмотрите случай, когда по какой-либо причине вы читаете до конца файла, но без remaining
становитесь нулем. Возможно, вы захотите подумать, действительно ли remaining
действительно полезен вообще ... почему бы просто не продолжать чтение блоков, пока не дойдете до конца потока?