Я должен программно загрузить большой файл прежде, чем обработать его. Что лучший способ состоит в том, чтобы сделать это? Поскольку файл является большим, я хочу к определенному времени ожидать так, чтобы я мог сильно выйти.
Я знаю о 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;
}
Существует ли лучший путь? Помогите.Спасибо.
Используйте 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);
}
}
}
Как насчет использования DownloadFileAsync
в классе WebClient. Самое замечательное в использовании этого маршрута состоит в том, что вы можете отменить операцию, вызвав CancelAsync
, если это займет слишком много времени. Как правило, вызовите этот метод, а если истечет определенное время, вызовите Cancel.
Здесь задали вопрос: 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
.