【发布时间】:2020-01-09 08:31:33
【问题描述】:
我有一个下载 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,但这可能不是最好的解决方案,因为当前的等待时间不够,它可以根据互联网连接而改变?
这里是完整的代码:
using System;
using System.Net;
using HtmlAgilityPack;
using System.IO;
using System.Threading;
namespace Crawler
{
class Program
{
static void Main(string[] args)
{
{
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);
}
}
}
}
Thread.Sleep(5000); // wait some time
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);
}
}
}
}
【问题讨论】:
-
旁注:现在是 2020 年......使用
await和WhenAll编写和管理回调要容易得多...... -
这能回答你的问题吗? DownloadFile vs DownloadFileAsync
标签: c# web-scraping web-crawler html-agility-pack