DownloadFileAsync:多个文件

时间:2011-06-19 13:52:11

标签: c# webclient progress downloadfileasync

我使用C#WebClient DownloadFileAsync遇到了一些问题,希望你能帮助我。

这是我的情景:

我正在使用WebClient DownloadFileAsync同时下载许多文件(http://example.com/abc/1.jpg, http://example.com/abc/efg/2.jpg等)。

我目前的示例代码是:

while (theres still files in http://example.com/abc/) {
    // filename will be something like /abc/1.jpg, /abc/efg/2.jpg
    if (!file.exists(directory.getcurrentdirectory()+filename.Replace('/', '\\'))) {
        WebClient webClient = new WebClient();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloadProgressChanged);
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(downloadCompleted);
        webClient.DownloadFileAsync(new Uri("http://example.com"+filename), Directory.GetCurrentDirectory()+filename.Replace('/', '\\'));
    }

如何将所有正在下载的文件显示在一个进度条中?

例如。 1.jpg是50kb,2.jpg是50kb,当1.jpg完成下载时,进度条将显示50%,而2.jpg将在进度条中从51%到100%。

此外,如果文件名是/abc/1.jpg,如果我当前的目录没有名为abc的文件夹,则下载将不起作用。如何根据文件名自动创建文件夹? (例如/random123/3.jpg,/anotherrandom/4.jpg等)

2 个答案:

答案 0 :(得分:0)

要为您提供一个总体进度计数器,需要一个集中的例程,为每个正在进行的转移收集完成量 - 完成 - 总量 - 下载总量并将它们相加以计算总计。由于传输是并行运行的,因此您不能只为每个文件分配一个进度条块(例如51-100%)。

对于大多数API,您需要在将文件写入文件夹之前为自己创建文件夹。在开始编写文件之前,只需执行此操作即可在路径上创建所有缺少的文件夹:

Directory.CreateDirectory(Path.GetDirectoryName(filename));

答案 1 :(得分:0)

要执行进度条,可以使用队列。完成下载后,更新进度条,然后开始下一次下载。 但是,我不认为WebClient类可以告诉你完成了多少下载,只有它完成了。

要验证目录是否存在,请使用:

if (!System.IO.Directory.Exists(folder_name)) System.IO.Directory.Create(folder_name);

您可以使用System.IO.Path类从路径获取目录。