2009-07-10 16 views
3

リモート(HTTP)サーバーからユーザーのローカルハードドライブにファイルをダウンロードする小さなアプリケーションがありますが、ファイルの一部が大きいものの、実行時にどれだけ大きいかを知っている。いくつかのタイプのプログレスメーターでファイルをダウンロードできる方法はありますか?Cのプログレスメーターを使用してWebからローカルファイルにファイルをダウンロード

これはWinFormsアプリケーションです。今はWebClient.DownloadFile()を使用してファイルをダウンロードしています。

編集: 私はDownloadProgressChangedイベントとOnDownloadProgressChangedイベントを調べましたが、うまくいくように見えますが、私のソリューションでは機能しません。私はいくつかのファイルをダウンロードしています.WebClient.DownloadFileAsyncを使用すると、各ファイルが呼び出されるため、イベントは数回/秒呼び出されます。
ここでアプリの基本的な構造である:私は

  • ファイルのリストをループを実行し、

そのdesinationにそれぞれ1をダウンロードし、典型的には、約114

  • のファイルのリストをダウンロード各ファイルをseperatlyでダウンロードしても問題ありませんが、DownloadFileAsync()でダウンロードすることなく、イベントハンドラを使用することはできません。

  • 答えて

    5

    WebClient.OnDownloadProgressChangedを使用してください。サーバーがサイズの正面を報告した場合にのみ進捗状況を計算することが可能です。

    EDIT:

    があなたの更新を見ると、あなたが試すことができますことは、URLのqueueを作っています。次に、ファイルのダウンロードが完了すると(DownloadDataCompletedイベント)、キュー内の次のURLの非同期ダウンロードが開始されます。私はこれをテストしていない。

    +0

    OnDownloadProgressChangedはメソッドであり、OPには役立ちません。それだけで、私の答えと同じようにDownloadProgressChangedイベントが発生します。イベントをキャッチすることが必要です。 – stevehipwell

    +2

    私はあなたがニットピッキングだと思う、Stevo。はい、イベントをキャッチする必要があります、と私は決して言いました。 –

    +0

    あなたはOnDownloadProgressChangedを使用することはありません。すべてのオペレーションはイベントをキャッチする必要があります。 OnDownloadProgressChangedは問題を混乱させます。 – stevehipwell

    1

    私はこれを書いただけで、あなたが望むことを行うように見えます。

    また、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; 
    } 
    
    1

    同様の問題を解決する必要があり、GenericTypeTeaのコード例がトリックでした。ただし、DownloadFileAsyncメソッドを呼び出すと、DownloadDataCompletedイベントが発生しないことがわかりました。代わりに、DownloadFileCompletedイベントが発生します。

    関連する問題