2011-12-06 26 views
3

現在、FTPサーバーから大きなファイルをダウンロードするアプリケーションを作成しています。すべてが小さなファイル(< 50 MB)でもうまく動作しますが、私がダウンロードしているファイルは、主に2 GBを超えるほど大きくなります。WebClient/FTP経由で大きなファイルをダウンロードする際の問題

私はDownload FileAsync()とリストシステムを使用してWebクライアントを試してきましたが、サイズのためにこれらのファイルを次々とダウンロードしています。

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火災され、それらはすべて1枚ずつダウンロードされ、小さなファイルにこの方法を絶対に正常に動作します。私が大きなファイルに直面しているこの問題は、問題なしで最初のダウンロードを開始しますが、それ以降は何もしません。 DownloadCompletedイベントは何らかの理由で決して発生しません。 WebClientは、ファイルのダウンロードが完了したことを知らないようです。これは、このイベントを使用してFilesToDownloadリストの次のダウンロードを開始するときの問題です。

私はまたWebClient.DownloadFileforループを使用して同期して、FilesToDownloadリストを循環させようとしました。最初のファイルを正しくダウンロードし、2回目のダウンロードを開始するときに例外が発生します。「基本接続が閉じられました:受信時に予期しないエラーが発生しました」

最後に、私はedtFTPnetを使用してFTP経由でこれを試みましたが、私はダウンロード速度の問題に直面しています(すなわち、ダウンロードはWebClientでフルスピードになり、edtFTPnetライブラリ)。

どのような考えですか?私はここでアイデアが不足していることを認めなければならない。

+0

バイトを取得することによってこれを行うためにファイルストリームまたはMemoryStreamを作成してみてください。また、GIGSまたはMBの – MethodMan

+0

を参照してlargeの定義を「large」と言います。 – Xeaz

+0

オペレーティングシステムが2GBのファイルサイズで4GBの制限があることを覚えている.NET 4.0を使用している場合Microsoft .NET 4.0でファイルサイズの制限を変更しましたので、intサイズをlongまたは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

は、このスレッドを更新し忘れたが、私はしばらく前に、これを整理する方法を考え出しました。

問題は、ファイル転送のために開かれたデータ接続が何らかの理由でランダムにタイムアウトするか、転送が終了する前にサーバーによって閉じられていたことです。しかし、なぜ私のコンピュータとリモートサーバの間にローカルと外部のネットワークインタフェースが負荷されているのかを知ることはできませんでした。それはまったくランダムです(つまり、転送が1行の5つのファイルに対して正常に機能し、1つのファイルに対してタイムアウトし、次のファイルなどに対して正常に動作します)、問題はサーバーまたはネットワークに関連する可能性があります。

ダウンロード中にFTPクライアントオブジェクトによって生成されたFTP例外をキャッチし、オフセットが転送が停止したデータストリーム内の位置と等しいRESTコマンドを発行しました(つまり、リモートファイルの総バイト数 - 現在ダウンロードされているバイト数)。そうすることで、ローカルファイルにない残りのバイトを取得できます。

関連する問題