CODE-使用C#程式從網站下載檔案

寫程式的人大家應該都有類似的經驗: 我想要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"));
    }
}
歡迎推文分享:
Published 14 October 2008 07:40 AM 由 Jeffrey
Filed under: ,
Views: 65,968



意見

# chicken said on 13 October, 2008 11:04 PM

沒有什麼特別的要求 (比如控制 timeout 啥的) 的話.. 這樣就搞定了。不過骨子裡做的跟你貼的是一樣的...

WebClient wc = new WebClient();

wc.DownloadFile(

 "blog.darkthread.net/.../darkthreadbanner.gif",

 "X:\\TEMP\\Darkthread.gif");

# shia said on 01 November, 2008 04:04 AM

可以請問一下 如何用Stream去讀入下載進度??

# Jeffrey said on 03 November, 2008 05:05 PM

to shia, httpResponse.ContentLength可以取得總共要取回的Byte數,在do while迴圈中則可由size累計已取回的Byte數,由這兩個數字就可以算出已下載的百分比。

# 咖啡喵 said on 26 November, 2008 02:53 AM

不建議用 webclient

雖然簡單

但 webclient 不帶 timeout 屬性

如果給定的 URL 不存在

它會「當」在那邊

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<October 2008>
SunMonTueWedThuFriSat
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication