2012-09-17 47 views
1

在我的應用程序,我需要從FTP服務器下載一些文件..我編碼通過for循環下載一個一個,它工作正常。我的問題是它是非常緩慢的過程因爲爲每個文件提供憑證。所以,如果我可以在FTP服務器壓縮這些文件就可以下載quickly..If有一種方法請指導我.. 這裏我的代碼:如何在FTP服務器目錄中的ZIP文件

塊引用

private void button1_Click(object sender, EventArgs e) 
    { 
     string[] list = GetFileList(); 
     DownloadFile(list, "e:\\sample\\"); 
    } 

    private String[] GetFileList() 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(_remoteHost)); 
     request.Credentials = new NetworkCredential(_remoteUser, _remotePass); 
     request.Method = WebRequestMethods.Ftp.ListDirectory; 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 

     string FileNames = reader.ReadToEnd(); 
     string[] Files = Regex.Split(FileNames, "\r\n"); 
     return Files; 
    } 


    private void DownloadFile(string[] fileList, string destination) 
    { 
     for (int i = 2; i <= fileList.Length - 1; i++) 
     { 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]); 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 
      request.Credentials = new NetworkCredential(_remoteUser, _remotePass); 
      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      Stream responseStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(responseStream); 

      StreamWriter writer = new StreamWriter(destination + fileList[i]); 
      writer.Write(reader.ReadToEnd()); 

      writer.Close(); 
      reader.Close(); 
      response.Close(); 
    } 
} 

Blockquote

+0

反正什麼?壓縮文件? – CloudyMarble

+1

如果你想在你下載文件之前壓縮文件,你必須在包含這些文件的服務器上編寫/安裝軟件的軟件。這對你來說可能是一種選擇嗎? – mortb

+0

假設您可以在上傳/下載文件之前將ftp服務器上的文件gzip壓縮,[此代碼片段](http://quantcorner.wordpress.com/2011/11/05/downloading-and-decompressing-on-the-fly -a-gzip-file-from-a-ftp-server-in-c /)可能很有用。 – PHeiberg

回答

1

爲什麼不使用用戶名和密碼啓動您的FtpWebRequest,然後在foreach中使用它爲所有文件循環而不是創建每輪都有一個新的?

另一種方法是使用第三方工具(如:http://www.rebex.net/ftp-ssl.net/),這可能會更快,但它的東西,你將不得不測試,採取looka牛逼的:https://stackoverflow.com/a/2343689/395659

第3方式可以是讓一份工作在一段時間內創建ZIP文件的服務器上運行,然後將其作爲Zip文件下載,如問題中所述。

+0

謝謝@MeNoMore:D, 我認爲我必須創建每個文件的web請求下載。所以我必須創建每個文件的web請求.. 在第三種方式不能爲我執行..它會限制由owener .. 唯一的方式,我可以看到使用第三方工具... 謝謝你的好友! – iJay

1

可以重新使用的憑證,這可能會加快您...

private void DownloadFile(string[] fileList, string destination) 
{ 

    var myCred = new NetworkCredential(_remoteUser, _remotePass); 

    for (int i = 2; i <= fileList.Length - 1; i++) 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 
     request.Credentials = myCred; 
     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     Stream responseStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(responseStream); 

     StreamWriter writer = new StreamWriter(destination + fileList[i]); 
     writer.Write(reader.ReadToEnd()); 

     writer.Close(); 
     reader.Close(); 
     response.Close(); 
} 

}

+0

感謝您的快速回復哥們, 它不加快下載..它將需要1.30分鐘下載50個文件(每1.83kb)。我得到了近** 500個文件** .. :( – iJay

1

如果您使用的是.NET 3.0或以上,您可以利用ZipPackage Class目前在System.IO.Packaging名稱空間。我還沒有嘗試壓縮遠程計算機上存在的文件,但您可以嘗試一下,否則您可能不得不編寫一個小作業來壓縮文件並將其部署到遠程(ftp)服務器上。

+0

謝謝@Saurabh, 我已經試過用遠程機器Zip Packeges,我認爲它不能用ftp協議.. – iJay

+0

然後,正如我所說,你需要寫一個小的工作,並將其部署到存在文件的計算機上,這項工作將壓縮文件,您可以稍後通過FTP下載這些文件。您可以安排每次運行作業,然後開始下載zip文件或以任何其他方式你喜歡的是好的。 – Luftwaffe

相關問題