Как программно загрузить большой файл в C#

Я должен программно загрузить большой файл прежде, чем обработать его. Что лучший способ состоит в том, чтобы сделать это? Поскольку файл является большим, я хочу к определенному времени ожидать так, чтобы я мог сильно выйти.

Я знаю о WebClient. DownloadFile (). Но там не кажется путем к определенному количество времени для ожидания, чтобы сильно выйти.

try
{
    WebClient client = new WebClient();
    Uri uri = new Uri(inputFileUrl);
    client.DownloadFile(uri, outputFile);
}
catch (Exception ex)
{
    throw;
}

Иначе должен использовать утилиту командной строки (wget), чтобы загрузить файл и запустить использование команды ProcessStartInfo и использовать WaitForExit Процесса (международный мс) для мощного выхода.

ProcessStartInfo startInfo = new ProcessStartInfo();
//set startInfo object

try
{
    using (Process exeProcess = Process.Start(startInfo))
    {
        //wait for time specified
        exeProcess.WaitForExit(1000 * 60 * 60);//wait till 1m

        //check if process has exited
        if (!exeProcess.HasExited)
        {
            //kill process and throw ex
            exeProcess.Kill();
            throw new ApplicationException("Downloading timed out");
        }
    }
}
catch (Exception ex)
{
    throw;
}

Существует ли лучший путь? Помогите.Спасибо.

8
задан hIpPy 19 February 2014 в 22:14
поделиться

3 ответа

Используйте WebRequest и получите поток ответа. Затем читайте из ответного потока блоки байтов и записывайте каждый блок в целевой файл. Таким образом, вы можете контролировать, когда остановиться, если загрузка занимает слишком много времени, поскольку вы получаете контроль между блоками и можете решить, закончилась ли загрузка, основываясь на часах:       

        DateTime startTime = DateTime.UtcNow;
        WebRequest request = WebRequest.Create("http://www.example.com/largefile");
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            using (Stream fileStream = File.OpenWrite(@"c:\temp\largefile")) { 
                byte[] buffer = new byte[4096];
                int bytesRead = responseStream.Read(buffer, 0, 4096);
                while (bytesRead > 0) {       
                    fileStream.Write(buffer, 0, bytesRead);
                    DateTime nowTime = DateTime.UtcNow;
                    if ((nowTime - startTime).TotalMinutes > 5) {
                        throw new ApplicationException(
                            "Download timed out");
                    }
                    bytesRead = responseStream.Read(buffer, 0, 4096);
                }
            }
        }
19
ответ дан 5 December 2019 в 05:25
поделиться

Как насчет использования DownloadFileAsync в классе WebClient. Самое замечательное в использовании этого маршрута состоит в том, что вы можете отменить операцию, вызвав CancelAsync , если это займет слишком много времени. Как правило, вызовите этот метод, а если истечет определенное время, вызовите Cancel.

7
ответ дан 5 December 2019 в 05:25
поделиться

Здесь задали вопрос: C #: Загрузка URL-адреса с тайм-аутом

Самое простое решение:

public string GetRequest(Uri uri, int timeoutMilliseconds)
{
    var request = System.Net.WebRequest.Create(uri);
    request.Timeout = timeoutMilliseconds;
    using (var response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new System.IO.StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

Лучшее (более гибкое) решение - этот ответ на тот же вопрос в виде вспомогательного класса WebClientWithTimeout .

3
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

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