全程干货 | 入门爬虫技术原理,看即篇就足足了

爬虫系统的诞生

蜘蛛爬虫

通用搜索引擎的拍卖对象是互联网网页,目前互联网网页的数就达百亿,所以寻找引擎首先面临的题材是:如何能统筹来高速的下载系统,以用如此海量的网页数据传送到当地,在当地形成互联网网页的镜像备份。

纱爬虫能够起及这般的意图,完成这个起艰巨的天职,它是寻觅引擎系统被那个关键也要命基础之部件。本文主要介绍和网爬虫相关的技能,尽管爬虫经过几十年之前进,从完整框架达成来拘禁就相对成熟,但随着互联网的不止进步,也面临着部分新的挑战。


  
今天闲着没事,研究了瞬间在线更新程序版本的问题。也是办事受到的需要,开始免理解什么样下手,各种百度也未曾找到好想如果的,因为自身之求比较简单,所以即便好琢磨了一下。讲出口自己之急需吧。自己以IIs上颁发了一个网站,这个网站仅仅只是内部采用的,网站的情节即是自的另外一个次(就叫A程序吧)的打包发布的文件放进去。然后以客户端启动自之A程序之前检查是不是发生新本子文件披露。如果起,我因网页源代码的消息和地面文件信息进行比,决定是否下载。如果出下载,下载就后执行A程序的.exe文件启动A程序。大致的要求就是是这样。

通用爬虫技术框架

爬虫系统率先从互联网页面中细心选料一些网页,以这些网页的链接地址作为种子URL,将这些种子放入待捕到手URL队列中,爬虫从需要捕到手URL队列依次读取,并以URL通过DNS解析,把链接地址转换为网站服务器对应的IP地址。然后用那和网页相对路径名称交给网页下载器,网页下载器负责页面的下载。对于生充斥至地面的网页,一方面将那个储存到页面库中,等待建立目录等持续处理;另一方面将下充斥网页的URL放入已批捕到手队列中,这个行列记录了爬虫系统已生充斥了之网页URL,以避免系统的再抓取。对于刚刚下载的网页,从中抽取产生含有的保有链接信息,并于就下载的URL队列中进行反省,如果发现链接还尚无受捉到手了,则坐需要捕到手URL队排的末尾,在之后的抓取调度中会下载者URL对应的网页。如此这般,形成巡回,直到待捕到手URL队列为空,这意味着正在爬虫系统以能抓取的网页就悉数抓了,此时得了同样轮完整的抓取过程。

通用爬虫架构

上述是一个通用爬虫的总体流程,如果起进一步宏观之角度考虑,处于动态抓取过程遭到的爬虫和互联网具有网页中的干,可以概括为以下5个组成部分:

现已生充斥网页结合:爬虫已经打互联网下充斥及地面开展索引的网页集合。

早已过期网页结合:由于网页数量庞大,爬虫完整抓取一轱辘需要较长时间,在抓取过程遭到,很多既下载的网页可能早就更新了,从而致使过期。之所以这么,是为互联网网页处于持续的动态变化过程遭到,所以容易发生本地网页内容以及真实性互联网未同等的情。

要下充斥网页集合:处于需要捕到手URL队列中的网页,这些网页即将于爬虫下充斥。

可知网页集合:这些网页还并未于爬虫下充斥,也绝非出现在待捕到手URL队列中,通过既抓取的网页还是在需要捕到手URL队列中的网页,总是能透过链接关系发现其,稍晚时候会让爬虫抓到手并索引。

不解网页集合:有些网页对爬虫是力不从心抓捕到手到的,这有些网页构成了不为人知网页结合。事实上,这有的网页所占据的比重不行高。

互联网页面划分

起明爬虫的角度看,对互联网网页为起而齐分有助于深入理解搜索引擎爬虫所面临的要害任务与挑战。绝大多数爬虫系统按照上文的流水线,但是绝不所有的爬虫系统都这么一致。根据具体运用的不等,爬虫系统在诸多点在出入,大体而一度,可以拿爬虫系统分为如下3栽档次。

批量型爬虫:批量型爬虫有较明白的抓取范围以及目标,当爬虫达到这个设定的目标后,即已抓取过程。至于具体对象可能不同,也许是设定抓取一定数额之网页即可,也许是设定抓取的时日等,各不雷同。

增量型爬虫:增量型爬虫与批量型爬虫不同,会保持持续不断的抓取,对于抓取到之网页,要限期更新,因为互联网网页处于不停转变备受,新增网页、网页为去除或网页内容更改都特别宽泛,而增量型爬虫需要就反映这种变更,所以处在持续不断的抓取过程被,不是于抓取新网页,就是当更新就出网页。通用的生意搜索引擎爬虫基本还属于此类。

垂直型爬虫:垂直型爬虫关注特定主题内容还是属于特定行业的网页,比如对于正规网站的话,只待从互联网页面里找到与正规有关的页面内容即可,其他行当之始末未在设想范围。垂直型爬虫一个顶要命之特性与难点就是:如何识别网页内容是否属于指定行业要主题。从省系统资源的角度来讲,不容许将有互联网页面下载后以进行筛选,这样见面招致资源过度浪费,往往得爬虫在抓取阶段便可知动态识别某个网址是否和主题相关,并尽可能不失抓取无关页面,以达省资源的目的。垂直搜索网站要垂直行业网站屡屡需要这个种植类型的爬虫。


   
首先自己公布一个测试网站,也不怕是概括的在IIS上拿本人本机的一个文本夹发布出来,具体怎么操作就未开教授了。得到本人的网址:http://localhost/webTest/。这个网站就作为我以后有新版本文件要发布就直接丢进去。   

得天独厚爬虫的特点

精爬虫的特性对不同之采用来说,可能实现的道各发差距,但是实用的爬虫都应当具备以下特征。

 葡京赌场网址 1

01高性能

互联网的网页数量是海量的。所以爬虫的性质至关重要,这里的习性主要是依赖爬虫下充斥网页的抓取速度,常见的品道是坐爬虫每秒能够下载的网页数量作为性能指标,单位时会下载的网页数量更为多,爬虫的性质更加强。

只要增长爬虫的性能,在计划时先后访问磁盘的操作方法及现实落实时数结构的取舍非常重大,比如对用捕到手URL队列和早已抓到手URL队列,因为URL数量十分好,不同实现方式性能表现迥异,所以高速的数据结构对于爬虫性能影响挺死。

   上面的截图中产生几只地方要注明一下:

02不过扩展性

哪怕单个爬虫的性特别高,要拿具备网页都生充斥至本地,仍然要一定丰富的日周期,为了能够尽可能缩短办案到手周期,爬虫系统应该有好好地而扩展性,即死轻通过加抓取服务器和爬虫数量来达到这目的。

脚下实用的巨型网络爬虫一定是分布式运行的,即多高服务器专做抓到手,每台服务器部署多单爬虫,每个爬虫多丝总长运行,通过强艺术充实并发性。对于大型的摸引擎服务商来说,可能还要以全球限量、不同地方分别部署数据核心,爬虫也受分配至不同的多寡基本,这样于增强爬虫系统的完整性是很有扶持的。

   1.是这文件最后一糟糕编辑日期。

03健壮性

爬虫要拜访各种类型的网站服务器,可能会见遇上特别多种非正常情况,比如网页HTML编码不标准,
被抓取服务器突然死机,甚至爬虫陷阱等。爬虫对各种异常情况能否正确处理非常重大,否则可能会见不期停止工作,这是无法忍受的。

自从另外一个角度来讲,假而爬虫程序在抓取过程遭到死掉,或者爬虫所当的服务器宕机,健壮的爬虫应能不辱使命,再次启航爬虫时,能够东山再起之前抓取的内容与数据结构,而非是历次都得将具备工作全从头做起,这也是爬虫健壮性的平等种植体现。

   2.凡最终一次等编辑时间点。    

04友好性

爬虫的友好性包含两点的义:一凡保障网站的有私密性,另一样是削减为抓取网站的网负载。爬虫抓到手之目标是各级项目的网站,对于网站所有者来说,有些内容并无期待吃抱有人搜到,所以需要设定协议,来告诉爬虫哪些内容是无容许抓取的。目前起少种植主流的计而达成这目的:爬虫禁抓协议以及网页禁抓标记。

爬虫禁抓协议指的是由网站所有者生成一个点名的文本robot.txt,并置身网站服务器的根目录下,这个文件指明了网站中怎样目录下的网页是不容许爬虫抓到手的。具有友好性的爬虫在搜捕到手该网站的网页前,首先要读取robot.txt文件,对于禁止抓取的网页不开展下载。

网页禁抓标记一般以网页的HTML代码里投入meta
name=”robots”标记,content字段指出允许或者不允爬虫的哪些行为。可以分成两栽状况,一栽是告诉爬虫不苟找引该网页内容,以noindex作为标志;另外一种情况是告爬虫不若抓取网页所蕴涵的链接,以nofollow作为标志。通过这种措施,可以齐对网页内容的一模一样栽隐私保护。

照以上协议的爬虫可以吃认为是投机之,这是于保安私密性的角度来设想的。另外一种植友好性则是,希望爬虫对某网站的看造成的网路负载较逊色。爬虫一般会依据网页的链接连续获得有网站的网页,如果爬虫访问网站频率过大,会让网站服务器造成大特别之造访压力,有时候还会见潜移默化网站的例行访问,造成类似DOS攻击的效用,为了削减网站的大网负载,友好性的爬虫应该在抓取策略部署时考虑每个被抓取网站的负载,在尽可能不影响爬虫性能的情下,减少对纯粹站点短期内的一再访问。


   3.凡您是文件的轻重缓急。

爬虫质量之评介标准

设若由查找引擎用户体验的角度考虑,对爬虫的工作效能来不同之褒贬标准,其中最要的3单正经是:抓取网页的覆盖率、抓取网页时新性及抓取网页根本。如果立刻3方面举行得好,则寻引擎用户体验肯定好。

对现有的物色引擎来说,还非在谁搜索引擎起力量将互联网及出现的有网页都产充斥并确立目录,所有寻引擎只能索引互联网的同样有的,而所谓的抓取覆盖率指的是爬虫抓到手网页的数额占据互联网具有网页数量之比例,覆盖率越强,等价于搜索引擎的召回率越强,用户体验越来越好。

目录网页和互联网网页对比

抓取到当地的网页,很有或都发生变化,或者受删,或者内容为更改,因为爬虫抓到手完一轱辘需要比较丰富的时日周期,所以抓取到之网页中必然会产生一对凡过的数码,即未能够在网页变化后第一时间反应及网页库中,所以网页库中过期的数据进一步少,则网页的时新性越好,这对用户体验的改良大有裨益。如果时新性不好,搜索到之都是过期数据,或者网页为删去,用户之胸感受可想而知。

互联网尽管网页繁多,但是每个网页的差异性都深死,比如来腾讯、网易新闻之网页和某个作弊网页相比,其首要犹如天壤之别。如果搜索引擎抓到手到之网页大部分凡是比重要之网页,则足以证实以抓取网页根本方面举行得比好。这面开的越来越好,则越是说明搜索引擎的寻精度越来越强。

经过上述3只专业的印证分析,可以拿爬虫研发的目标略描述如下:在资源少的气象下,既然搜索引擎只能抓取互联网现存网页的一律有,那么即使尽量让选择于重要之那有些页面来索引;对于早已逮捕到手到之网页,尽可能快的翻新内容,使得索引网页和互联网对应页面内容并创新;在这基础及,尽可能扩展抓取范围,抓取到还多以前没法儿察觉的网页。3个“”尽可能”基本说了解了爬虫系统啊加强用户体验而努力的靶子。

巨型商贸搜索引擎为了满足3个质量标准,大都开发了差不多套针对很强的爬虫系统。以Google为例,至少含有两模仿不同的爬虫系统,一效仿于叫作Fresh
Bot,主要考虑网页的时新性,对于内容更新往往之网页,目前足达到以秒计的创新周期;另外一仿为称作Deep
Crawl
Bot,主要对更新不是那么累的网页抓取,以天吧创新周期。除此之外,Google投入了老大酷精力研发针对暗网的抓取系统,后续,有时空以认证暗网系统。

Google的少效仿爬虫系统

假若你对爬虫有趣味,还好阅读:全程干货 |
解密爬虫抓到手、更新网页的策略措施

   4.椭圆片段凡是一个文件夹。

  
前面标题说之所以递归,就是盖网站被恐怕存在子文件夹,遇到子文件夹我将连续跟进去读取源代码获取自我一旦的音信。

   注:网页遭到生个[to parent
Directory]立马是外的父文件夹,我们以读取网页源代码的时如果针对性就一部分开展处理

   注:1,2局部是负这文件最后一不好编辑时,比如说你当本土有个公文你对客展开末一不善的编辑时2016/8/26
13:15 
那无论是您将此文件拷贝或是上传到其它地方,那他的编写时老不见面变的。

   大致的景象介绍的大都了,接下直接开始自己的读取网页下载文件之先后吧!上代码,一如既往,图文并茂的篇章才是好章。

  
一、创建一个winform工程。

  
葡京赌场网址 2

         图(1):工程组织

 葡京赌场网址 3

       图(2):winform需要的控件

 图(1)中我上加了片只辅助类似:FileHelper.cs/HttpHelper.cs。在后做详细介绍

 图(2)中1凡是一个label控件,用来展示在下载的文本称。2凡progressBar控件,winform自带的快漫漫控件,我觉着还坏好用的。。还需一个backgroundwork控件

 二:帮助类似公事

FileHelper.cs帮助类似公事。

葡京赌场网址 4葡京赌场网址 5

1  public class FileHelper
2  {
3       public DateTime ModiDate { get; set; } //最后编辑时间
4 
5      public long Size { get; set; }  //文件大小
6 
7      public String FilePath { get; set; }  //路径+文件名
8  }

View Code

HttpHelper.cs

葡京赌场网址 6葡京赌场网址 7

  1 /// <summary>
  2         /// 获取网页源代码
  3         /// </summary>
  4         /// <param name="serverUrl">网址</param>
  5         /// <param name="listFile">存放下载文件的集合</param>
  6         /// <param name="listHref">存放子目录集合</param>
  7 
  8         public static void GetHtmlResource(string serverUrl, List<FileHelper> listFile, List<string> listHref)
  9         {
 10             #region
 11             //Uri u = new Uri(serverUrl);
 12             //string host = u.Host;
 13             //if (serverUrl.EndsWith("/"))
 14             //{
 15             //    //1.获取网页源代码
 16             //    WebClient wc = new WebClient();
 17             //    wc.Credentials = CredentialCache.DefaultCredentials;
 18             //    byte[] htmlData = wc.DownloadData(serverUrl);
 19             //    string htmlStr = Encoding.Default.GetString(htmlData);
 20             //    //2.正则找到href属性内容截取
 21             //    string regMat = @"(?is)<a[^>]*?href=(['""\s]?)(?<href>[^'""\s]*)\1[^>]*?";
 22             //    MatchCollection mat = Regex.Matches(htmlStr, regMat, RegexOptions.IgnoreCase);
 23             //    List<string> listHref = new List<string>(); //存放href结合
 24             //    for (int i = 0; i < mat.Count; i++)
 25             //    {
 26             //        string item = mat[i].Groups["href"].Value;
 27             //        listHref.Add(item);
 28             //        MatchCollection match = Regex.Matches(htmlStr, "([0-9]{1,})\\s\\<A\\sHREF=\""+ item+"\"", RegexOptions.IgnoreCase);
 29             //        if(match.Count == 1 && match[0].Groups.Count==2)
 30             //        {
 31             //            fileSize.Add(@"http://" + host + item, int.Parse(match[0].Groups[1].Value));
 32             //        }
 33             //    }
 34             //    foreach (var item in listHref) //Match item in mat
 35             //    {
 36             //        string url = @"http://"+host + item;
 37             //        if (serverUrl.StartsWith(url))
 38             //        {
 39             //            continue;
 40             //        }
 41             //        GetHtmlResource(url, serverFilePath,fileSize);
 42             //    }
 43             //}
 44             //else
 45             //{
 46             //    serverFilePath.Add(serverUrl);
 47             //}
 48             #endregion
 49 
 50             Uri u = new Uri(serverUrl);
 51             string host = u.Host;
 52             if (serverUrl.EndsWith("/"))
 53             {
 54                 //1.获取网页源代码
 55                 WebClient wc = new WebClient();
 56                 wc.Credentials = CredentialCache.DefaultCredentials;
 57                 byte[] htmlData = wc.DownloadData(serverUrl);
 58                 string htmlTempStr = Encoding.Default.GetString(htmlData);
 59                 //完全用字符串截取的方式得到自己想要的东西
 60                 htmlTempStr = htmlTempStr.Substring(htmlTempStr.IndexOf("<pre>"));
 61                 htmlTempStr = htmlTempStr.Substring(0, htmlTempStr.IndexOf("</pre>"));
 62                 htmlTempStr = htmlTempStr.Replace("<pre>", "");
 63                 htmlTempStr = htmlTempStr.Replace("</pre>", "");
 64                 htmlTempStr = htmlTempStr.Replace("&lt;dir&gt;", "-1"); //把子菜单前面的"&lt;dir&"改为-1,为了跟其他的信息一致有规律
 65                 htmlTempStr = htmlTempStr.Replace("<br>", "#");
 66                 string[] tempStr = htmlTempStr.Split('#');
 67                 ArrayList listStr = new ArrayList(tempStr);
 68                 //移除每个新网页的父级文件夹
 69                 listStr.RemoveAt(0);      
 70                 for (int i = 0; i < listStr.Count; i++)
 71                 {
 72                     if (String.IsNullOrWhiteSpace(listStr[i].ToString()))
 73                     {
 74                         listStr.RemoveAt(i);
 75                     }
 76                 }
 77                 tempStr = (string[])listStr.ToArray(typeof(string));
 78 
 79                 for (int f = 0; f < tempStr.Length; f++)
 80                 {
 81                     //截取最后修改日期带时间
 82                     string fileModiTime = tempStr[f].Substring(0, 20); 
 83                     //截取文件大小
 84                     string fileSize = tempStr[f].Substring(20, tempStr[f].IndexOf("<A") - 20); 
 85                     //截取文件路径 
 86                     string filePath = tempStr[f].Split('\"')[1];
 87                     FileHelper file = new FileHelper();
 88                     file.ModiDate = Convert.ToDateTime(fileModiTime.Trim());
 89                     file.Size = Convert.ToInt32(fileSize.Trim());
 90                     file.FilePath = @"http://" + host + filePath;
 91                     //如果大小为-1,我就认为是子文件夹,添加到集合中
 92                     if (file.Size == -1)
 93                     {
 94                         listHref.Add(file.FilePath);
 95                     }
 96                     else
 97                     {
 98                         //添加到要下载的文件集合中
 99                         listFile.Add(file);
100                     }
101                 }
102                 //循环我的子文件夹集合
103                 foreach (var item in listHref)
104                 {
105                     //如果item等于我的serverUrl继续
106                     if (serverUrl.StartsWith(item))
107                     {
108                         continue;
109                     }
110                     //递归
111                     GetHtmlResource(item, listFile, listHref);
112                 }
113 
114             }
115         } 

View Code

葡京赌场网址 8葡京赌场网址 9

 1  /// <summary>
 2         /// 下载文件
 3         /// </summary>
 4         /// <param name="serverUrl">文件在服务器的全路径</param>
 5         /// <param name="localFilePath">下载到本地的路径</param>
 6         public static void DownLoadMdiFile(string serverUrl,string localFilePath)
 7         {
 8             //localFilePath = localFilePath.Replace(".exe.config.xml", ".exe.config");
 9             if (localFilePath.Contains(".exe.config.xml"))
10             {
11                 localFilePath = localFilePath.Replace(".exe.config.xml", ".exe.config");
12             }
13             if (localFilePath.Contains(".config.xml"))
14             {
15                 localFilePath = localFilePath.Replace(".config.xml", ".config");
16             } 
17             //网页中子文件夹是否存在,如果不存在,创建文件夹,存在直接下载文件       
18             FileInfo file = new FileInfo(localFilePath);
19             if(!file.Directory.Exists)
20             {
21                 Directory.CreateDirectory(file.Directory.FullName);
22 
23             }            
24             try
25             {
26                 WebClient wc = new WebClient();
27                 if (!localFilePath.Contains("web.config"))
28                 {
29                     wc.DownloadFile(serverUrl, localFilePath);
30                 }                
31             }
32             catch (Exception e)
33             {
34                 throw;
35             }
36         }

View Code

三:banckgroundwork控件
对于此控件我待贯彻他的老三独事件。很简单的老三个事件,看事件名称即使能够了解他的意了

第一个:backgroundWorker1_DoWork

葡京赌场网址 10葡京赌场网址 11

 1 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
 2         {
 3             #region 
 4             //string installUrl = GetInstallPath();
 5             //List<string> listFilePath = new List<string>();
 6             //Dictionary<string, int> fileSize = new Dictionary<string, int>();
 7             //HttpHelper.GetHtmlResource(installUrl, listFilePath, fileSize);
 8             //for (int i=0;i<listFilePath.Count;i++)
 9             //{
10             //    if (backgroundWorker1.CancellationPending)
11             //    {
12             //        e.Cancel = true;
13             //        return;
14             //    }
15             //    double total = listFilePath.Count;
16             //    double current = i+1;
17             //    int progress = (int)(current / total * 100);
18             //    string serverUrl = listFilePath[i];
19             //    int size = fileSize[serverUrl];
20             //    backgroundWorker1.ReportProgress(progress, serverUrl.Replace(installUrl, ""));                
21             //    string localPath = serverUrl.Replace(installUrl, localInstallPath);
22             //    if (File.Exists(localPath))
23             //    {
24             //        FileStream fs = new FileStream(localPath, FileMode.Open);
25 
26             //        if (fs.Length != size)
27             //        {
28             //            try
29             //            {
30             //                HttpHelper.DownLoadMdiFile(serverUrl, localPath);
31             //            }
32             //            catch (Exception )
33             //            {
34             //                throw;
35             //            }
36             //        }
37             //        fs.Close();
38             //    }
39             //    else
40             //    {
41             //        HttpHelper.DownLoadMdiFile(serverUrl, localPath);
42             //    }
43             //}
44             #endregion
45             string installUrl = GetInstallPath();
46             List<string> listHref = new List<string>();//存放子文件夹集合
47             List<FileHelper> listFile = new List<FileHelper>();//存放下载文件集合
48             HttpHelper.GetHtmlResource(installUrl, listFile, listHref);
49             for (int i = 0; i < listFile.Count; i++)
50             {
51                 if (backgroundWorker1.CancellationPending)
52                 {
53                     e.Cancel = true;
54                     return;
55                 }
56                 double total = listFile.Count;
57                 double current = i + 1;
58                 int progress = (int)(current / total * 100);      
59                 //服务器文件+全路径         
60                 string serverUrl = listFile[i].FilePath;
61                 //服务器文件大小
62                 long size = listFile[i].Size;
63                 //服务器文件最后修改时间
64                 DateTime modiTine = listFile[i].ModiDate;
65                 //backgroundWorker1执行到那个阶段
66                 backgroundWorker1.ReportProgress(progress, serverUrl.Replace(installUrl, ""));
67                 string localPath = serverUrl.Replace(installUrl, localInstallPath);
68                 //判断文件是否存在
69                 if (File.Exists(localPath))
70                 {
71                     //获取本地文件
72                     FileInfo fs = new FileInfo(localPath);
73                     //如果服务器文件大小,最后修改时间和本地文件进行对比,是否有变化
74                     if (fs.Length != size || fs.LastWriteTime != modiTine)
75                     {
76 
77                         try
78                         {
79                             HttpHelper.DownLoadMdiFile(serverUrl, localPath);
80                         }
81                         catch (Exception)
82                         {
83 
84                             throw;
85                         }
86                     }
87 
88                 }
89                 else
90                 {
91                     HttpHelper.DownLoadMdiFile(serverUrl, localPath);
92                 }
93             }
94         }

View Code

第二个:backgroundWorker1_ProgressChanged

葡京赌场网址 12葡京赌场网址 13

1  private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
2         {
3             this.progressBar.Value = e.ProgressPercentage;
4             var display = e.UserState.ToString();
5             labDisplay.Text = display.Trim();
6             //lbl_pbvalue.Text = "更新进度" + e.ProgressPercentage + "%";
7         }

View Code

第三个:backgroundWorker1_RunWorkerCompleted

葡京赌场网址 14葡京赌场网址 15

 1 private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 2         {
 3             runningPath += "A.exe";
 4             try
 5             {
 6                 System.Diagnostics.Process.Start(runningPath);
 7             }
 8             catch (Exception ex)
 9             {
10                 MessageBox.Show(ex.Message);
11             }
12 
13             this.Close();
14         }

View Code

以动用backgroundwork和progressBar控件的下用专注几个点
 this.backgroundWorker1.WorkerReportsProgress = true;  用于进度长长的创新
 this.backgroundWorker1.WorkerSupportsCancellation = true;
提供中途停止进程

 this.progressBar.Maximum = 100;给一个尽大值

 好吧!就如此一个粗略的在线更新文件的顺序即使整治定啦!

 【转载注明出处!谢谢】