Как я загружаю большой файл (через HTTP) в.NET?

После Java 7 отличный способ настроить средства ведения журнала, которым требуются (или предпочитать) статические ссылки на включающий класс, - это использовать недавно представленный API-интерфейс MethodHandles, чтобы получить класс времени выполнения в статическом контексте.

Пример фрагмента для SLF4J:

private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

Помимо того, что он является простым фрагментом в любой среде IDE, он также менее хрупок, если вы переделываете определенные функции в другой класс, потому что вы не будете случайно переносить имя класса с ним.

24
задан Peter Mortensen 1 August 2015 в 20:46
поделиться

4 ответа

Если вы используете WebClient.DownloadFile , вы можете сохранить его прямо в файл.

38
ответ дан 28 November 2019 в 22:17
поделиться

Класс WebClient предназначен для упрощенных сценариев. Как только вы пройдете простые сценарии (а у вас есть), вам придется немного отступить и использовать WebRequest.

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


Пример:

public void MyDownloadFile(Uri url, string outputFilePath)
{
    const int BUFFER_SIZE = 16 * 1024;
    using (var outputFileStream = File.Create(outputFilePath, BUFFER_SIZE))
    {
        var req = WebRequest.Create(url);
        using (var response = req.GetResponse())
        {
            using (var responseStream = response.GetResponseStream())
            {
                var buffer = new byte[BUFFER_SIZE];
                int bytesRead;
                do
                {
                    bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE);
                    outputFileStream.Write(buffer, 0, bytesRead);
                } while (bytesRead > 0);
            }
        }
    }
}

Обратите внимание, что если WebClient.DownloadFile работает, я бы назвал его лучшим решением. Я написал это до того, как был опубликован ответ «DownloadFile». Я также написал это слишком рано утром, так что может потребоваться скепсис (и тестирование).

33
ответ дан 28 November 2019 в 22:17
поделиться

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

Как вы написали, весь ответ, все 2 ГБ, должно быть в памяти. Даже в 64-битной системе, которая достигает предела в 2 ГБ для одного объекта .NET.


Обновление: более простой вариант. Получите WebClient , который сделает всю работу за вас: с его методом DownloadFile , который помещает данные прямо в файл.

9
ответ дан 28 November 2019 в 22:17
поделиться

Я бы использовал что-то вроде это

2
ответ дан 28 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: