我有用于下载PDF文件的代码。现在,当我执行下一个任务时遇到了一个问题,但是最后一个文件的下载尚未完成。执行完当前代码后,最后一个文件约为650 Mb,应为1300 Mb。另外,由于无法完全下载,因此无法将其打开,这就是为什么损坏了。
该进程无法访问该文件,因为它正在被另一个文件使用过程。
如何确保文件被下载?
HtmlDocument htmlDoc = new HtmlWeb().Load("http://example.com/");
// Thread.Sleep(5000); // wait some time
HtmlNodeCollection ProductListPage = htmlDoc.DocumentNode.SelectNodes("//div[@class='productContain padb6']//div[@class='large-4 medium-4 columns']/a");
foreach (HtmlNode src in ProductListPage)
{
htmlDoc = new HtmlWeb().Load(src.Attributes["href"].Value);
// Thread.Sleep(5000); // wait some time
HtmlNodeCollection LinkTester = htmlDoc.DocumentNode.SelectNodes("//div[@class='row padt6 padb4']//a");
if (LinkTester != null)
{
foreach (var dllink in LinkTester)
{
string LinkURL = dllink.Attributes["href"].Value;
Console.WriteLine(LinkURL);
string ExtractFilename = LinkURL.Substring(LinkURL.LastIndexOf("/"));
var DLClient = new WebClient();
// Thread.Sleep(5000); // wait some time
DLClient.DownloadFileAsync(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
}
}
}
我的下一个过程是重命名下载的文件:
var files = Directory.GetFiles(@"C:\temp\", "*.pdf");
// string prefix = "SomePrefix";
foreach (var file in files)
{
string newFileName = Path.Combine(Path.GetDirectoryName(file), file.Replace("-", " "));
File.Move(file, newFileName);
}
重命名可以顺利进行,直到最后一个文件没有完全下载,这就是我遇到的错误。
我在这两个之间添加了Thread.Sleep(5000); // wait some time
,但这可能不是最好的解决方案,因为当前的等待时间不足,并且可以根据互联网连接而改变?
您当然不希望使用WebClient.DownloadFileAsync
,但要使用其较新的后继产品WebClient.DownloadFileTaskAsync
。可以这样使用:
WebClient.DownloadFileTaskAsync
这是一个await DLClient.DownloadFileAsyncTask(new Uri(LinkURL), @"C:\temp\" + ExtractFilename);
进程,因此您的调用方法也必须是async
。通过async
对其进行设置,可以确保仅在下载完成(或失败)之后程序才能继续。