Как на c# сохранить в массив больше чем 2 147 483 647 единиц?

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

byte[] bytes = File.ReadAllBytes("data.zip")

я получу исключение index out of range?

и как этого можно избежать?


Ответы (1 шт):

Автор решения: aepot

Файлы больших размеров никогда не вычитываются в память полностью. Это неэффективно.

Например, пусть у вас будет некий метод, который умеет слать файл с диска в сеть

const int bufferSize = 16384;

public async Task SendFileAsync(string path)
{   
    await SendHeaderAsync(Path.GetFileName(path));
    using var fs = File.OpenRead(path);
    byte[] buffer = new byte[bufferSize];
    int bytesRead = 0;
    while ((bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length)) > 0)
    {
        await SendDataAsync(buffer, bytesRead);
    }
    // завершаем отправку, закрываем соединение
}

private async Task SendHeaderAsync(string filename)
{
    // инициализируем отправку, к примеру отправляем имя файла
}

private async Task SendDataAsync(byte[] buffer, int length)
{
    // отправляем length байт из буфера
}

Решение быть может не суперидеальное, но я старался показать пример как можно проще. Данное решение справится с совершенно с любым файлом, скушав несколько мегабайт оперативы. При том потребление оперативы не зависит от размера файла.

→ Ссылка