证明文件存在?还有如何在浏览网站时阻止程序冻结

时间:2013-03-24 00:54:15

标签: c# file download html-agility-pack freeze

嘿,我开始学习C#和HtmlAgilityPack,到目前为止我正在研究一个小测试项目。我遇到的一个问题是检查文件是否已存在以便不下载两次。

另一个问题是,在抓取网站/下载图片时,我的整个程序会冻结一段时间才能再次正常运行,有没有办法解决这个问题?

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(string 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();
        }
    }

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

您的程序可能会冻结,因为您在UI线程上运行的项目很长。

您可能希望查看使用前面提到的后台工作程序,或者(如果您使用的是.Net 4.5)新的async / await系统

GetStreamAsync对于这种情况非常完美,当你有一个潜在的漫长等待或许多项目时,而不是迭代地获取它们 http://msdn.microsoft.com/en-gb/library/vstudio/hh551738.aspx

另外作为附注,如果我有3张图片{1.jpg,2.jpg,foo / 1.jpg}你放的代码你不会得到第三张,因为名字与第一张图片匹配,有还有比jpeg / jpg更多的图片扩展名:)