2

使用以下代码下载文件时:

WebClient wc = new WebClient();
wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);
wc.DownloadFileAsync("http://path/file, "localpath/file");

并且在下载过程中发生错误(没有互联网连接,找不到文件等)它在 localpath/file 中分配了一个 0 字节的文件,这可能会很烦人。

有没有办法以干净的方式避免这种情况?

(我已经只是在下载错误时探测 0 字节文件并将其删除,但我认为这不是推荐的解决方案)

4

1 回答 1

3

如果您对代码进行逆向工程,WebClient.DownloadFile您将看到FileStream在下载开始之前就已实例化。这就是即使下载失败也会创建文件的原因。无法修改该代码,因此您应该考虑采用不同的方法。

有很多方法可以解决这个问题。考虑使用WebClient.DownloadData而不是WebClient.DownloadFile仅在下载完成时创建或写入文件,并且您确定您拥有所需的数据。

WebClient client = new WebClient();

client.DownloadDataCompleted += (sender, eventArgs) =>
{
    byte[] fileData = eventArgs.Result;
    //did you receive the data successfully? Place your own condition here. 
    using (FileStream fileStream = new FileStream("C:\\Users\\Alex\\Desktop\\Data.rar", FileMode.Create))
        fileStream.Write(fileData, 0, fileData.Length);
};

client.DownloadDataAsync(address);
client.Dispose();
于 2013-05-14T13:13:27.703 回答