Метод чтения/записи FileStream может принимать только значение integer
как длину. Но объект FileStream
возвращает длину в long
. В этом случае, если размер файла больше, чем integer
значение (приблизительно более 2 ГБ). Затем, как метод чтения/записи FileStream обрабатывает значение long
.
Ограничение метода чтения/записи FileStream
Ответ 1
Затем вы читаете и записываете несколько кусков. CLR в любом случае имеет ограничение на размер любого конкретного объекта (также около 2 ГБ IIRC, даже на 64-битной CLR), поэтому у вас не может быть массива байтов, достаточно большого для того, чтобы это было проблемой.
В любом случае вы должны всегда зацикливаться, так как вы не можете гарантировать, что вызов Read будет считать столько байтов, сколько вы запросили, даже если там больше данных.
EDIT: чтение в кусках:
byte[] buffer = new byte[1024 * 32];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
// Use the data you've read
}
Запись в кусках будет зависеть от того, что вы пишете... это трудно говорить об этом в абстрактной форме.
Ответ 2
Нет необходимости напрямую писать более 2 Гб данных за один вызов
Если бы у вас действительно была такая буферизированная память в памяти (? maby как неуспешно приобретенный UnmanagedMemoryStream для реализации дампа ядра?), вы могли бы легко выполнить запись в нескольких вызовах. Во всяком случае, он будет записан на диск в блоках от 512k до max 4k на текущем оборудовании.
Большое значение интерфейсов "потоковой передачи" заключается в том, что вы можете использовать его любым способом. Фактически, когда вы займетесь этим, вы обнаружите, что массивы CLR (и все остальное) на самом деле ограничены 2GB.
Update
Поскольку вы теперь признались, что в основном хотите копировать потоки, вам может быть лучше подано мгновенное решение. Существует File.Copy
File.Copy("file-a.txt", "file-new.txt");
Или есть стандартный ответ
Stream input
input.CopyTo(output); // .NET 4.0
// .NET 3.5 and others
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
}
Не забывайте о Flushing
, Closing
и Disposing
ваших потоках как подходящих, если вы обрабатываете потоки вручную.
Приветствия
Ответ 3
насколько я знаю, вы все равно можете использовать поиск, чтобы попасть в нужную позицию в потоке.
вам, вероятно, придется зацикливаться, чтобы сделать это, и если вы хотите прочитать более двух концертов, вам также понадобится цикл здесь