2011-12-06 60 views
3

我目前正在構建一個應用程序,其中包括從FTP服務器下載大文件。一切工作正常的小文件(< 50 MB),但我下載的文件是更大的方式,主要超過2 GB。通過WebClient/FTP下載大文件問題

我一直在使用一個使用DownloadfileAsync()和一個列表系統的Webclient,因爲我一個接一個地下載這些文件,因爲它們的大小。

DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress); 
DownloadClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted); 

private void FileDownload() 
{ 
    DownloadClient.DownloadFileAsync(new Uri(@"ftp://" + RemoteAddress + FilesToDownload[0]), LocalDirectory + FilesToDownload[0])); 
} 

private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e) 
{ 
    // Handle progress 
} 

private void DownloadCompleted(object sender, AsyncCompletedEventArgs e) 
{ 
    FilesToDownload.RemoveAt(0); 
    FileDownload(); 
} 

它工作絕對沒這樣的小文件,它們都下載一個接一個,進度報告和每個文件後DownloadCompleted火災。我遇到的大文件的這個問題是,它會首先下載沒有任何問題的下載,但之後不會做任何事情。由於某些原因,DownloadCompleted事件不會觸發。它看起來像WebClient不知道該文件已完成下載,這是一個問題,因爲我正在使用此事件啓動FilesToDownload列表中的下一個下載。

我也試過同步使用WebClient.DownloadFilefor循環來遍歷我的FilesToDownload列表。它會正確下載第一個文件,並在第二次下載應該開始時出現異常:「底層連接已關閉:接收時出現意外錯誤」。

最後,我試圖通過使用edtFTPnet通過FTP來通過這個,但我面臨下載速度問題(即我的下載全速與WebClient,我只獲得全速的1/3與edtFTPnet庫)。

有什麼想法?我不得不承認,我在這裏沒有想法。

+0

嘗試創建一個文件流或一個MemoryStream通過獲取字節和當你說「大」時做什麼,你參照GIGS或MB的大的定義是什麼 – MethodMan

+0

我的大文件超過2演出。 – Xeaz

+0

記得操作系統處理2 gig的文件大小,但4 gig限制是如果您使用.NET 4.0 Microsoft更改了.NET 4.0中的文件大小限制,所以您將不得不更改您的int大小爲多頭或Int64類型可以粘貼你正在使用的確切例子..數據的演出總是需要更長的時間。記住交換文件和tmp文件,它不只是一個直接的副本,你必須有目標媒體上的可用存儲空間 – MethodMan

回答

0
public string GetRequest(Uri uri, int timeoutMilliseconds) 
{ 
    var request = System.Net.WebRequest.Create(uri); 
    request.Timeout = timeoutMilliseconds; 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    using (var reader = new System.IO.StreamReader(stream)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 
0

忘記更新此主題,但我想了一下如何解決這個問題。

問題是由於某種原因,爲文件傳輸打開的數據連接隨機超時,或者在傳輸結束之前被服務器關閉。我一直無法弄清楚爲什麼,但是由於我的電腦和遠程服務器之間有大量的本地和外部網絡接口。由於它完全是隨機的(即傳輸對於連續五個文件工作正常,超時一個文件,對於下列文件等工作正常),問題可能與服務器或網絡相關。

我現在在下載過程中捕獲FTP客戶端對象引發的任何FTP異常,併發出REST命令,其偏移量等於傳輸停止的數據流中的位置(即遠程文件的總字節量 - 當前下載的字節數量)。這樣做可以獲取本地文件中缺少的剩餘字節。