CODE-使用C#程式從網站下載檔案
4 |
寫程式的人大家應該都有類似的經驗: 我想要Blah Blah,應該怎麼做?
這問題要是發生在十年前,肯定是項艱鉅的挑戰,只能到圖書館/書店翻書找看看,是否找得到跟所耗費的時間,就要看平日是否有積德行善,常扶老太太過街。運氣好一點的人,身旁剛好有高人前輩,開口問一下就有答案,多半上輩子是樂善好施員外投胎轉世才有此等造化。
Google的出現徹底改變了知識交流運用的模式,我認為它的革命性並不亞於工業革命。現在,只要接上Internet,動幾下手指,原本也許要花上十天半個月才找得到的答案,一瞬間就送到眼前。雖然有報導誇張地指出: 搜尋成癮,大腦變抽水馬桶,但也不能否認,這個時代還不懂得善用搜尋引擎及Internet,跟原始人也沒什麼兩樣。
面對沒做實作過的需求,我的第一個動作當然也是先Google。但總有種困擾,網路上提供的解答五花八門,良莠不齊,若原本對該領域就不熟悉(就是不熟才要找範例),要由其中篩選出"正確"、"有效率"的做法談何容易? 我是否走對門路挑對方法? 若一開始遇人不淑,學錯方法,說不定一輩子都用可樂瓶敲釘子,渾然不知世上有種東西叫鐵錘... orz 這一直是我在Google找尋範例程式時最大的疑慮。
有個不錯的例子: List, Dictionary or SortedList?
要克服最佳化疑惑有幾種做法: 1) 花點心思讀讀系統化介紹相關議題的書籍、Tutorial或WhitePaper 2) 挑選較具權威性的來源,例如: MSDN論壇眾多MVP的回答、專業人士的Blog、CodeProject...等 3) 透過無遠弗界的Internet跟高手互相砌磋。
CODE系列的文章應該算是我企圖實踐第三種做法的嘗試,針對某個課題,我會提出搜尋研究過的最佳解法。但純粹是我的個人意見,若來往小站的高手達人們,有人發現其中有待改進之處,還請不吝指點,我會再修正改良。
第一砲: 如何寫一小段C# Code去下載網站上的某個檔案並存檔?
【2008-10-14 Update】原做法果然是可樂瓶,鐵鎚來了,謝謝Chicken提供:
using System;
using System.Net;
public class CSharpLab
{
public static void Test()
{
WebClient wc = new WebClient();
wc.DownloadFile("http://blog.darkthread.net/images/darkthreadbanner.gif",
"b:\\darkthread.gif");
}
}
原文做法如下,建議若為單純取檔,用以上寫法取代。若有顯示下載進度等需求,再考慮自己用Stream讀入。
using System;
using System.IO;
using System.Net;
public class CSharpLab
{
public static void Test()
{
string url = "http://blog.darkthread.net/images/darkthreadbanner.gif";
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
System.IO.Stream dataStream = httpResponse.GetResponseStream();
byte[] buffer = new byte[8192];
FileStream fs = new FileStream("X:\\TEMP\\Darkthread.gif",
FileMode.Create, FileAccess.Write);
int size = 0;
do
{
size = dataStream.Read(buffer, 0, buffer.Length);
if (size > 0)
fs.Write(buffer, 0, size);
} while (size > 0);
fs.Close();
httpResponse.Close();
Console.WriteLine("Done at " + DateTime.Now.ToString("HH:mm:ss.fff"));
}
}
Comments
# by chicken
沒有什麼特別的要求 (比如控制 timeout 啥的) 的話.. 這樣就搞定了。不過骨子裡做的跟你貼的是一樣的... WebClient wc = new WebClient(); wc.DownloadFile( "http://blog.darkthread.net/images/darkthreadbanner.gif", "X:\\TEMP\\Darkthread.gif");
# by shia
可以請問一下 如何用Stream去讀入下載進度??
# by Jeffrey
to shia, httpResponse.ContentLength可以取得總共要取回的Byte數,在do while迴圈中則可由size累計已取回的Byte數,由這兩個數字就可以算出已下載的百分比。
# by 咖啡喵
不建議用 webclient 雖然簡單 但 webclient 不帶 timeout 屬性 如果給定的 URL 不存在 它會「當」在那邊