於是乎模仿了網路上的範例
依樣畫葫蘆寫個FTP的下載代碼(含續傳、進度顯示)
private void Download(string filePath, string fileName) { FtpWebRequest ftpReq; //宣告FTP連線 ftpReq = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + IpAdd + "/" + fileName)); //取得欲下載檔案的大小(位元)存至 fiesize ftpReq.Method = WebRequestMethods.Ftp.GetFileSize; //認證 ftpReq.Credentials = new NetworkCredential(UName, UPWord); int filesize = (int)ftpReq.GetResponse().ContentLength; //宣告FTP連線 ftpReq = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + IpAdd + "/" + fileName)); //下載 ftpReq.Method = WebRequestMethods.Ftp.DownloadFile; //認證 ftpReq.Credentials = new NetworkCredential(UName, UPWord); //binaary ftpReq.UseBinary = true; //進度列初始化 progressBar1.Value = 0; progressBar1.Maximum = filesize; lbProgress.Text = "0/" + filesize.ToString(); //支援續傳 FileInfo fi = new FileInfo(filePath + "\\" + fileName); FileStream fs = null; //檢測是否已有相同檔名的存在於client端 if (fi.Exists) { //若存在,由中斷點繼續傳輸 ftpReq.ContentOffset = fi.Length; //.apend 檔案存在時開啟檔案至末端 or 建立新檔 fs = new FileStream(filePath + "\\" + fileName, FileMode.Append); } else //client端無檔案 則重新建立新檔 fs = new FileStream(filePath + "\\" + fileName, FileMode.Create); //建立ftp連線 FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse(); bool bfinish = false; try { //取得下載用的stream物件 //ftpResp.GetResponseStream()--->擷取包含從FTP server傳送之回應資料的資料流 using (Stream stm = ftpResp.GetResponseStream()) { //以block方式多批寫入 byte[] buff = new byte[5]; //讀data int len = 0; while (fs.Length < filesize) { //取得長度 len = stm.Read(buff, 0, buff.Length); fs.Write(buff, 0, len); //更新 progress bar if (progressBar1.Value + len <= progressBar1.Maximum) { progressBar1.Value += len; lbProgress.Text = "傳輸中... " + progressBar1.Value.ToString() + "/" + filesize.ToString(); progressBar1.Refresh(); Application.DoEvents(); } //傳完 if (fs.Length == filesize) { progressBar1.Value = progressBar1.Maximum; lbProgress.Text = "傳輸成功! " + filesize.ToString() + "/" + filesize.ToString(); } } fs.Flush(); //傳完,bfinish = true //清除資料流的緩衝區 bfinish = (fs.Length == filesize); fs.Close(); stm.Close(); } } catch (System.Net.WebException we) { //若未傳完才要觸發 exception if (!bfinish) throw we; } ftpResp.Close(); }
以上模仿參考至黑暗執行緒前輩的文章
相當讚的部落格!使我獲益良多
文章一 文章二
如有侵權我會立刻刪除!