Вы можете использовать меньшие буферы фиксированного размера, например:
byte[] bytes = new byte[8192]; // adjust this as needed
int bytesRead;
do {
bytesRead = fsIn.Read(bytes, 0, bytes.Length);
fsOut.Write(bytes, 0, bytesRead);
} while (bytesRead > 0);
Это довольно очевидно, за исключением последнего блока, так что в основном я передаю 8-байтовый массив в метод Read, который возвращает количество байтов, которые он фактически прочитал. Поэтому при вызове Write я передаю это значение, которое находится где-то между 0 и 8192. Другими словами, в последнем блоке, даже если я передаю байтовый массив из 8192 байтов, bytesRead
может быть только 10, в этом случае необходимо записать только первые 10 байтов.
EDIT
Я отредактировал свой ответ, чтобы сделать это немного по-другому. Вместо того, чтобы использовать позицию входного файла, чтобы определить, когда выйти из цикла, я проверяю, является ли bytesRead больше нуля. Этот метод работает с любым видом потока для потокового копирования, включая потоки, которые не имеют фиксированной или известной длины.