Как на 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 байт из буфера
}
Решение быть может не суперидеальное, но я старался показать пример как можно проще. Данное решение справится с совершенно с любым файлом, скушав несколько мегабайт оперативы. При том потребление оперативы не зависит от размера файла.