C# の進行状況メーターを使用して、Web からローカル ファイルにファイルをダウンロードする
質問
リモート(HTTP)サーバーからユーザーのローカルハードドライブにいくつかのファイルをダウンロードする小さなアプリがあります。ファイルの一部は大きいですが、実行時のサイズがどれくらいかわかりません。何らかの進行状況メーターを含むファイルをダウンロードできる方法はありますか?
これは WinForms アプリです。現在、WebClient.DownloadFile() を使用してファイルをダウンロードしています。
編集:DownloadProgressChanged イベントと OnDownloadProgressChanged イベントを調べたところ、正常に動作しているようですが、私のソリューションでは動作しません。複数のファイルをダウンロードしていますが、WebClient.DownloadFileAsync を使用すると、各ファイルが呼び出すため、イベントが 1 秒あたり数回呼び出されます。
アプリの基本構造は次のとおりです。
- 通常約 114 個のファイルのリストをダウンロードします
- ファイルのリストに対してループを実行し、各ファイルを宛先にダウンロードします。
各ファイルを個別にダウンロードすることは問題ありませんが、DownloadFileAsync() でダウンロードしないとイベント ハンドラーを使用できません。
解決
WebClient.OnDownloadProgressChanged して使用してください。それは、サーバがアップフロントサイズが報告された場合の進行状況を計算するだけで可能ですが、覚えておいてください。
EDITます:
あなたはキューを作って試すことができるか、あなたの更新を見てみますA> URLの。次に、ファイルのダウンロードが完了すると( DownloadDataCompleted イベント)は、キュー内の次のURLの非同期のダウンロードを開始します。私はこれをテストしていません。
他のヒント
Webクライアント DownloadProgressChanged のイベントを処理ます。
私はちょうどこれを書いていると、間違いなくあなたがやりたいように見えます。
また、ProgressChangedイベントの中に、あなたは「TotalBytesToReceive」プロパティおよび「は、bytesreceived」プロパティを持っています。
private void StartDownload()
{
// Create a new WebClient instance.
WebClient myWebClient = new WebClient();
// Set the progress bar max to 100 for 100%
progressBar1.Value = 0;
progressBar1.Maximum = 100;
// Assign the events to capture the progress percentage
myWebClient.DownloadDataCompleted+=new DownloadDataCompletedEventHandler(myWebClient_DownloadDataCompleted);
myWebClient.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(myWebClient_DownloadProgressChanged);
// Set the Uri to the file you wish to download and fire it off Async
Uri uri = new Uri("http://external.ivirtualdocket.com/update.cab");
myWebClient.DownloadFileAsync(uri, "C:\\Update.cab");
}
void myWebClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
void myWebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
progressBar1.Value = progressBar1.Maximum;
}
私は同様の問題を解決するために必要な、とGenericTypeTeaのコード例では、トリックを行いました。それ以外、私はあなたがDownloadFileAsyncメソッドを呼び出すときDownloadDataCompletedイベントが発生されていないことを発見しました。代わりに、DownloadFileCompletedイベントが発生します。