Estou escrevendo um aplicativo em que é necessário baixar um arquivo exe de um site. Estou usando o Visual studio express 2008.
Estou usando o seguinte código.
private void button1_Click(object sender, EventArgs e)
{
WebClient webClient = new WebClient();
webClient.DownloadFileAsync(new Uri("http://example.com/images/def.exe"), @"d:acdef.exe");
}
O def.exe é baixado na pasta Ac do drive D, mas é de 0 byte.
Não consigo entender por que isso está acontecendo.
Por favor me ajude.
Respostas:
2 para resposta № 1Você pode alterar seu código um pouco para fazê-lo funcionar. DownloadFileAsync
é uma chamada assíncrona, portanto, pode ser que seu thread o execute, terminando antes que o download seja concluído.
Você precisa anexar um manipulador para descobrir se o download foi concluído se você estiver usando o assíncrono
[TestMethod]
public void TestDownload()
{
var webClient = new WebClient();
webClient.DownloadProgressChanged += webClient_DownloadProgressChanged;
webClient.DownloadFileAsync(new Uri("https://www.telerik.com/downloads/productfiles/btmba/TelerikJustDecompileSetup_2014.3.1021.0.exe"), @"c:tempjustdecompile.exe");
// just to show in a Unit Test.. Not required in actual code
Thread.Sleep(10000);
var info = new FileInfo(@"c:tempjustdecompile.exe");
Assert.IsTrue(info.Length > 0);
}
Seu manipulador pode ser parecido com,
void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Debug.WriteLine(String.Format("{0} downloaded {1} of {2} bytes. {3} % complete...",
(string)e.UserState,
e.BytesReceived,
e.TotalBytesToReceive,
e.ProgressPercentage));
}
4 para resposta № 2
o DownloadFileAsync
método é executado de forma assíncrona, ou seja, ele retorna assim que o download é iniciado. Se você quiser esperar até que termine, você tem que se inscrever no DownloadFileCompleted
evento.
Claro, você também pode usar o método síncrono, como este:
webClient.DownloadFile(new Uri("http://example.com/images/def.exe"), @"d:acdef.exe");