none
如何在下載檔案前先檢查檔案是否存在? RRS feed

  • 問題

  • 如何在下載檔案前先檢查檔案是否存在?

        
            private void button1_Click(object sender, EventArgs e)
            {
    
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri("http://g0.gstatic.com/ig/images/weather/partly_cloudy.png"), @"c:\partly_cloudy.png");
                
            }
    
            private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                label1.Text = progressBar1.Value.ToString();
                progressBar1.Value = e.ProgressPercentage;
            }
    
            private void Completed(object sender, AsyncCompletedEventArgs e)
            {
                MessageBox.Show("Download completed!");
            }

    • 已編輯 david432 2012年3月18日 下午 12:06
    2012年3月18日 下午 12:03

解答

  • 您好,
    是的! 因為是非同步!

    所以client3後會繼續往下執行哦!

    所以要知道有沒有download完成,要在DownloadFileCompleted事件中才知道哦!

    如果您想要一個一個download的話,就使用同步的方式,如下所示,

    WebClient client = new WebClient();
    client.Credentials = CredentialCache.DefaultNetworkCredentials;
    client.DownloadFile(new Uri(@"http://localhost/t1.txt"), @"f:\t1.txt");
    MessageBox.Show("download t1 Finished!");
    client.DownloadFile(new Uri(@"http://localhost/t2.txt"), @"f:\t2.txt");
    MessageBox.Show("download t2 Finished!");
    client.DownloadFile(new Uri(@"http://localhost/t3.txt"), @"f:\t3.txt");
    MessageBox.Show("download t3 Finished!");


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 david432 2012年3月24日 上午 09:34
    2012年3月23日 上午 12:53

所有回覆

  • 先發一個 HTTP Request 過去看會不會是傳回 HTTP 404 不就行了。

    亦或是在 DownloadCompleted 事件檢查是否是 HTTP 404。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年3月18日 下午 12:46
    版主
  • http 通訊協定沒有檢查檔案是否存在的部分,最多可以取得時間跟大小。

    如果 Server 有允許檔案瀏覽,應該會輸出 html 格式的檔案清單,不過這就是 case by case 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月18日 下午 02:20
  • 您好,
    呼叫webClient.DownloadFileAsync如果發生錯誤,是否可表示該檔案不存在呢?

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月19日 上午 04:40
  • 請問這樣可以嗎

    如果filesize=0 就 檔案不存在??

    還有請問webClient.DownloadFile和webClient.DownloadFileAsync有什麼分別?

    public static void download(string link, string savepath, string filename) { links = link; savepaths = savepath; filenames = filename; try { //MessageBox.Show(link + savepath + filename); HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(link); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); MessageBox.Show("link ok"); fileSize = myHttpWebResponse.ContentLength; myHttpWebResponse.Close(); WebClient webClient = new WebClient(); webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); // webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); MessageBox.Show(link + " "+ savepath + filename); webClient.DownloadFileAsync(new Uri(link), savepath + filename); } catch (WebException e) { MessageBox.Show("ERROR" + e.Message); if (e.Status == WebExceptionStatus.ProtocolError) { // MessageBox.Show("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); MessageBox.Show("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); } }



    • 已編輯 david432 2012年3月22日 下午 04:17
    2012年3月22日 下午 04:16
  • 如果要檢查本機檔案可以這樣寫嗎?

     try
    {
    File.OpenRead(link);
    }
     catch (FileNotFoundException)
    {
    MessageBox.Show("can't find the file");
    }

    2012年3月22日 下午 04:23
  • 您好,本機的話,您可以用

    File.Exists 方法


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月22日 下午 04:40
  • 您好,
    DownloadFile是以同步的方式來download file,
    DownloadFileAsync是以非同步的方式來download file.
    所以如果使用DownloadFileAsync,要知道檔案何時Download完成的話,要在 DownLoadFileCompleted 事件才知道哦!

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月22日 下午 04:48
  • 請問一下 可否做到先下載完成一個檔案才RUN 下一句??

    現在是同時下載3個檔案

         private void Form1_Load(object sender, EventArgs e)
            {
                MessageBox.Show("s");
                download_api download_api = new download_api();
                download_api.download("http://localhost/joomla/LICENSE.txt", @"C:/", "LICENSE.txt");
                download_api.download("http://localhost/joomla/d.rar", @"C:/", "d.rar");
                download_api.download("http://localhost/joomla/ff.zip", @"C:/", "ff.zip");
                download_api.showf();
            }



    • 已編輯 david432 2012年3月22日 下午 05:14
    2012年3月22日 下午 05:13
  • 您好,
    請問您是用同一個WebClient instance去Download多個檔案嗎?
    會有WebClient does not support concurrent I/O operations.錯誤吧!
    請參考以下資訊,謝謝!
    WebClient multi file Downloader error

    private void button1_Click(object sender, EventArgs e)
    {
    	WebClient client1 = new WebClient();
    	client1.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
    	client1.Credentials = CredentialCache.DefaultNetworkCredentials;
    	WebClient client2 = new WebClient();
    	client2.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
    	client2.Credentials = CredentialCache.DefaultNetworkCredentials;
    	WebClient client3 = new WebClient();
    	client3.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
    	client3.Credentials = CredentialCache.DefaultNetworkCredentials;
    	client1.DownloadFileAsync(new Uri(@"http://localhost/t1.txt"), @"f:\t1.txt");
    	client2.DownloadFileAsync(new Uri(@"http://localhost/t2.txt"), @"f:\t2.txt");
    	client3.DownloadFileAsync(new Uri(@"http://localhost/t3.txt"), @"f:\t3.txt");
    
    }
    
    private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
    	MessageBox.Show("Game Update Finished!");
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月22日 下午 05:24
  • 我用了你的CODE 在

    client3.DownloadFileAsync(new Uri(@"http://localhost/t3.txt"), @"f:\t3.txt");

    下面加了MessageBox.Show("Finished!");

    但發現  MessageBox.Show("Game Update Finished!");沒有出現3次就出了MessageBox.Show("Finished!");

    在下載檔案2~3時 已經出現了MessageBox.Show("Finished!");

    2012年3月22日 下午 06:01
  • 您好,
    是的! 因為是非同步!

    所以client3後會繼續往下執行哦!

    所以要知道有沒有download完成,要在DownloadFileCompleted事件中才知道哦!

    如果您想要一個一個download的話,就使用同步的方式,如下所示,

    WebClient client = new WebClient();
    client.Credentials = CredentialCache.DefaultNetworkCredentials;
    client.DownloadFile(new Uri(@"http://localhost/t1.txt"), @"f:\t1.txt");
    MessageBox.Show("download t1 Finished!");
    client.DownloadFile(new Uri(@"http://localhost/t2.txt"), @"f:\t2.txt");
    MessageBox.Show("download t2 Finished!");
    client.DownloadFile(new Uri(@"http://localhost/t3.txt"), @"f:\t3.txt");
    MessageBox.Show("download t3 Finished!");


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 david432 2012年3月24日 上午 09:34
    2012年3月23日 上午 12:53