Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 证明文件存在?此外,如何停止你的程序冻结时,替罪羊网站_C#_File_Download_Html Agility Pack_Freeze - Fatal编程技术网

C# 证明文件存在?此外,如何停止你的程序冻结时,替罪羊网站

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='

嘿,我开始学习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(字符串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冻结。谢谢,现在一切都正常工作了,这一点更清楚了。