我在使用C#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是50Mb,当1.jpg完成下载时,进度条将显示50%,2.jpg的进度条将从51%到100%。
此外,如果文件名是/abc/1.jpg,如果我的当前目录没有名为abc的文件夹,则下载将不起作用。如何使它根据文件名自动创建文件夹?(例如/random123/3.jpg,/aotherrandom/4.jpg等)
要为您提供一个总体进度计数器,您需要一个集中的例程,该例程收集到目前为止完成的金额和每个正在进行的传输要下载的总金额,并将它们相加以计算总金额。因为传输是并行运行的,所以不能只为每个文件分配一块进度条(例如51-100%)。
对于大多数API,在将文件写入文件夹之前,您需要为自己创建文件夹。只需在开始写入文件之前在路径上创建所有丢失的文件夹:
Directory.CreateDirectory(Path.GetDirectoryName(filename));
要完成进度条的操作,可以使用队列。下载完成后,更新进度条,然后开始下一次下载。然而,我不认为WebClient类可以告诉你下载完成了多少,只有当它是否完成了。
要验证目录是否存在,请使用:
if (!System.IO.Directory.Exists(folder_name)) System.IO.Directory.Create(folder_name);
可以使用System.IO.path类从路径获取目录。