寫程式的人大家應該都有類似的經驗: 我想要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 不存在 它會「當」在那邊

Post a comment