我有以下内容:
wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
FileStream f = File.OpenWrite(insLoc + "\\update.zip");
wc.DownloadDataAsync(new Uri("http://example.com/file.zip"), installLoc + "\\file.zip");
(并在一个单独的函数中)
private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
if (e.Error == null) {
MessageBox.Show("Download success");
}
else { MessageBox.Show("Download failed"); }
f.Flush();
f.Dispose();
}
当我检查文件它应该下载到它时,它存在,但它没有任何内容(即,它是0字节)。下载完成后我刷新了FileStream,那么发生了什么?我也有一个进度条,它慢慢增加到100%,所以我知道它正在下载ZIP文件,以及"下载成功"消息框显示。
提前致谢!
答案 0 :(得分:3)
您应该使用回调函数来保存生成的文件(表示为作为第二个参数传递的字节数组):
wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
wc.DownloadDataAsync(new Uri("http://example.com/file.zip"));
然后:
private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
if (e.Error == null)
{
string resultFile = Path.Combine(insLoc, "update.zip");
System.IO.File.WriteAllBytes(resultFile, e.Result);
MessageBox.Show("Download success");
}
else
{
MessageBox.Show("Download failed");
}
}
现在您可以快速看到使用此方法将整个文件作为字节数组加载到内存中,然后将其刷新到文件系统。这非常低效,尤其是在下载大文件时。因此,建议改为使用DownloadFileAsync
方法。
wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
string resultFile = Path.Combine(insLoc, "update.zip");
var uri = new Uri("http://example.com/file.zip");
wc.DownloadFileAsync(uri, resultFile);
和相应的回调:
private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show("Download success");
}
else
{
MessageBox.Show("Download failed");
}
}
答案 1 :(得分:1)
我会使用 WebClient 的DownloadFileTaskAsync
方法,我发现它非常简单。
await wc.DownloadFileTaskAsync(new Uri("http://example.com/file.zip"), installLoc + "\\file.zip");
就是这样。如果您想查看下载进度,可以附加到DownloadProgressChanged
事件。