I need to programmatically download a large file before processing it. What's the best way to do that? As the file is large, I want to specific time to wait so that I can forcefully exit.
I know of WebClient.DownloadFile(). But there does not seem a way to specific an amount of time to wait so as to forcefully exit.
try
{
WebClient client = new WebClient();
Uri uri = new Uri(inputFileUrl);
client.DownloadFile(uri, outputFile);
}
catch (Exception ex)
{
throw;
}
Another way is to use a command line utility (wget) to download the file and fire the command using ProcessStartInfo and use Process' WaitForExit(int ms) to forcefully exit.
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;
}
Is there a better way? Please help. Thanks.
How about using
DownloadFileAsync
in the WebClient class. The cool thing about going this route is that you can cancel the operation by callingCancelAsync
if it takes too long. Basically, call this method, and if a specified amount of time elapses, call Cancel.You can use
DownloadFileAsync
as @BFree said and then try with the following WebClient's eventsThen you can know the Progress Percentage
Hope this helps
Asked here: C#: Downloading a URL with timeout
Simplest solution:
Better (more flexible) solution is this answer to the same question, in the form of a
WebClientWithTimeout
helper class.Use a WebRequest and get the response stream. Then read from the reponse Stream blocks of bytes, and write each block to the destination file. This way you can control when to stop if the download takes too long, as you get control between chunks and you can decide if the download has timed out based on a clock: