FileStream Ограничение чтения / записи метода - PullRequest
11 голосов
/ 13 апреля 2011

Метод чтения / записи FileStream может принимать только значение integer в качестве длины. Но FileStream объект возвращает длину в long. В этом случае, что если размер файла больше integer значения (приблизительно больше 2 ГБ). Тогда как метод FileStream для чтения / записи обрабатывает long значение.

Ответы [ 3 ]

13 голосов
/ 13 апреля 2011

Затем вы читаете и пишете несколькими кусками. В любом случае CLR имеет ограничение на размер любого конкретного объекта (также около 2 ГБ IIRC, даже на 64-битном CLR), поэтому у вас не может быть байтового массива, достаточно большого, чтобы это могло стать проблемой.

Вы все равно должны всегда выполнять цикл при чтении, поскольку вы не можете гарантировать, что вызов Read прочитает столько байтов, сколько вы запросили, даже если есть еще данные.

РЕДАКТИРОВАТЬ: чтение в кусках:

byte[] buffer = new byte[1024 * 32];
int bytesRead;

while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Use the data you've read
}

Написание кусками будет зависеть от того, что вы пишете ... об этом трудно говорить в резюме.

4 голосов
/ 13 апреля 2011

Нет необходимости напрямую записывать более 2 ГБ данных за один вызов

Если бы вы действительно располагали эту сумму в буфере непрерывно в памяти («как, например, небезопасно приобретенный UnmanagedMemoryStream для реализации дампа ядра?»), Вы могли бы легко объединять записи в несколько вызовов. В любом случае, он будет записан на диск блоками от 512 Кбайт до 4 Кбайт на текущем оборудовании.

Огромная ценность потоковых интерфейсов в том, что вы можете использовать их любым способом. Фактически, когда вы посмотрите на него, вы обнаружите, что массивы CLR (и все остальное) фактически ограничены 2 ГБ

Обновление

Поскольку вы теперь признались, что в основном хотите копировать потоки, вам лучше воспользоваться мгновенным решением. Есть 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 ваших потоков в зависимости от ситуации , если вы обрабатываете потоки вручную.

Приветствия

0 голосов
/ 13 апреля 2011

насколько я знаю, вы все еще можете использовать поиск, чтобы добраться до нужной позиции в потоке.

вам, вероятно, придется сделать цикл, чтобы сделать это, и если вы хотите прочитать больше 2 гигабайт, вам тоже нужно будет выполнить цикл здесь

...