C# 证明文件存在?此外,如何停止你的程序冻结时,替罪羊网站
嘿,我开始学习C#和HtmlAgilityPack,到目前为止,我正在做一个小测试项目。我遇到的一个问题是检查一个文件是否已经存在,以避免下载两次 另一个问题是,在抓取网站/下载图像时,我的整个程序将冻结一段时间,然后才能重新运行,有没有办法解决这个问题C# 证明文件存在?此外,如何停止你的程序冻结时,替罪羊网站,c#,file,download,html-agility-pack,freeze,C#,File,Download,Html Agility Pack,Freeze,嘿,我开始学习C#和HtmlAgilityPack,到目前为止,我正在做一个小测试项目。我遇到的一个问题是检查一个文件是否已经存在,以避免下载两次 另一个问题是,在抓取网站/下载图像时,我的整个程序将冻结一段时间,然后才能重新运行,有没有办法解决这个问题 if (!File.Exists(@"Res\" + pokeName + ".jpg")) { var item = doc.DocumentNode.SelectNodes("//a[@class='
if (!File.Exists(@"Res\" + pokeName + ".jpg"))
{
var item = doc.DocumentNode.SelectNodes("//a[@class='image']//img")[0];
if (doc.DocumentNode.SelectNodes("//a[@class='image']//img") != null)
{
getImage(item.GetAttributeValue("src", ""));
pictureBox1.Load(@"Res\" + pokeName + ".jpg");
}
}
else
{
pictureBox1.Load(@"Res\" + pokeName + ".jpg");
}
及
public void getImage(字符串url)
{
string imageUrl = @""+ url;
string saveLocation = @"Res\"+ pokeName + ".jpg";
byte[] imageBytes;
HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
WebResponse imageResponse = imageRequest.GetResponse();
Stream responseStream = imageResponse.GetResponseStream();
using (BinaryReader br = new BinaryReader(responseStream ))
{
imageBytes = br.ReadBytes(500000);
br.Close();
}
responseStream.Close();
imageResponse.Close();
FileStream fs = new FileStream(saveLocation, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
try
{
bw.Write(imageBytes);
}
finally
{
fs.Close();
bw.Close();
}
}
非常感谢您的帮助:)您的程序可能已冻结,因为您的UI线程上有长时间运行的项目 您可能想看看前面提到的使用后台工作程序,或者(如果您使用的是.Net 4.5)新的异步/等待系统 GetStreamAsync非常适合这种情况,因为您可能需要等待很长时间,或者需要处理很多项,而不是迭代获取它们
另外,作为旁注,如果我有3个图像{1.jpg,2.jpg,foo/1.jpg},那么您输入的代码你不会得到第三张,因为名字与第一张图像匹配,还有比jpeg/jpg更多的图像扩展名:)最好每个问题问一个问题。
File.Exists
有什么不起作用的吗?查看BackgroundWorker
,在后台完成下载工作e仍然能够为UI提供进度。@Peter Ritchie,谢谢,我会记住这一点。我不确定我是否正确使用了它,至于后台工作人员,我看了一点,但我不太明白。你知道我可以使用什么好的教程或资源来帮助我理解吗?你可以简单地使用getImage方法,而不是你的getImage方法使用该方法的异步或异步变体来避免UI冻结。谢谢,现在一切都正常工作了,这一点更清楚了。