標籤:
本功能主要用到的知識點如下:
1、Regex
2、C#中下載檔案功能的實現
3、泛型集合的使用
4、進程的簡單操作(用於結束當前程式)
下面就簡單說一下是如何使用這些知識點的。先詳細說下這個程式主要實現的功能是什麼,現有一個文字檔裡面都是從網頁上複製下來的原始碼。現需要將其中的以http、https、ftp開頭,以.jpg,.png,.gif開頭的圖片URL地址篩選出來,並去訪問這些連結,將URL中所對應的圖片下載下來。經過分析後。決定使用Regex篩選URL地址。並使用WebClient類去實現下載的功能。代碼如下:
1 using System.Text.RegularExpressions; 2 using System; 3 using System.Net; 4 using System.IO; 5 using System.Diagnostics; 6 using System.Collections.Generic; 7 namespace URLRegex 8 { 9 class Program 10 { 11 public static List<string> getUrl(string data) 12 { 13 List<string> strUrl= new List<string>();//定義泛型,用於存放抓取的URL 14 string regexStr = @"(http|ftp|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)+\.(png|jpg|gif)";//尋找URL的Regex 15 Regex reg = new Regex(regexStr, RegexOptions.IgnoreCase);//Regex的類執行個體化 16 MatchCollection mc = reg.Matches(data);//進行匹配 17 if (mc.Count <= 0)//判斷沒有抓取到一條合法的URL 18 { 19 Console.WriteLine("未抓取到合格URL,按任意鍵退出程式"); 20 Console.ReadKey(); 21 Process.GetCurrentProcess().Kill(); 22 } 23 for (int i = 0; i < mc.Count; i++) 24 { 25 strUrl.Add(mc[i].Groups[0].Value);//將匹配的資料裝入泛型集合 26 } 27 return strUrl;//返回這個泛型集合 28 29 }//得到URL 30 31 public static void downLoad(List<string> tempUrl) 32 { 33 34 string currentPath = System.Environment.CurrentDirectory;//得到目前的目錄 35 Directory.CreateDirectory(currentPath + @"\photos\");//在目前的目錄下建立photos檔案夾 36 string currentPathPhotos = currentPath + @"\photos\";//得到photos的路徑 37 38 WebClient myDownload = new WebClient();//執行個體化webclient類,用於下載 39 int i = 1; //用於圖片的命名 40 Regex regJPG = new Regex(".jpg", RegexOptions.RightToLeft);//判斷圖片是不是.jpg格式 41 Regex regPNG = new Regex(".png", RegexOptions.RightToLeft);//判斷圖片是不是.png格式 42 43 foreach (string temp in tempUrl)//遍曆擷取到的圖片URL,並下載和儲存 44 { 45 Match mJpg = regJPG.Match(temp); 46 if (mJpg.Success) 47 { 48 string filePathJpg = currentPathPhotos + i + ".jpg"; 49 try 50 { 51 myDownload.DownloadFile(temp, filePathJpg); 52 Console.WriteLine("下載成功"); 53 i++; 54 } 55 catch 56 { 57 Console.WriteLine("下載失敗"); 58 } 59 60 } 61 else 62 { 63 Match mPng = regPNG.Match(temp); 64 65 if (mPng.Success) 66 { 67 string filePathPng = currentPathPhotos + i + ".png"; 68 try 69 { 70 myDownload.DownloadFile(temp, filePathPng); 71 Console.WriteLine("下載成功"); 72 i++; 73 } 74 catch 75 { 76 Console.WriteLine("下載失敗"); 77 } 78 79 } 80 else 81 { 82 string filePathgif = currentPathPhotos + i + ".gif"; 83 try 84 { 85 myDownload.DownloadFile(temp, filePathgif); 86 Console.WriteLine("下載成功"); 87 i++; 88 } 89 catch 90 { 91 Console.WriteLine("下載失敗"); 92 } 93 } 94 95 } 96 97 } 98 99 Process.Start("explorer", currentPathPhotos);//完成後立即呈現結果100 }//實現下載101 102 public static void Main()103 {104 string currentPath = Environment.CurrentDirectory; 105 string source= File.ReadAllText(currentPath+@"\test.txt");//讀入檔案106 List<string> temp = getUrl(source);//篩選URL107 Console.WriteLine("篩選後的URL地址如下:");108 foreach (string t in temp)109 {110 Console.WriteLine(t.ToString());//輸入URL111 }112 Console.WriteLine("正在下載圖片……");113 downLoad(temp);//下載圖片114 Console.WriteLine("\n下載結束,按任意鍵退出");115 Console.ReadKey();116 }//主函數117 }118 }
View Code
痛點是:
1、Regex的構建,因為才接觸到Regex,所以對於其Regex的構建不是很熟悉,自己也在百度了查了不少的資料。也看過別人的寫的一些相似的Regex後。才寫出了這個Regex。
2、異常的處理。比如檔案開啟失敗,下載失敗。未得到正確的URL地址等等。(解決方案:添加上try和catch在catch中用到了當前進程的結束)。
在C#中使用Regex篩選出圖片URL並下載圖片URL中的圖片到本地