| ホーム | 掲示板 | 特集 | サンプル | Tips | リンク | その他 | blog 

Tips
[VS2003]
 日付時刻の演算
 ListBoxにファイル一覧
 ファンクションF10
 WMIでサービス一覧
 YAHOO検索エンジン
[VS2005]
 Administrator権限チェック
 非同期ExecuteReader
 非同期ExecuteReader(CallBack)
 パスの結合
 ファイルを圧縮して保存
 コントロール配列の実装
 DataGridViewのCellイベント
 CSVファイルをDataGridViewに表示
 DataGridViewのリンクセルを見やすく
 DataGridViewマウス右ボタンで選択
 DataGridViewスクロール制御
 DataGridViewのCell移動をEnterで
 DataRepeaterコントロール
 GZ圧縮ファイルを解凍
 ファイルの削除
 ディレクトリ有無チェック
 ファイルのダウンロード
 非同期ファイルダウンロード
 ドライブの一覧
 ファイルのコピー
 ファイル有無チェック
 テキストファイルを読み込む
 特定の文字列を含むファイル検索
 フォームを表示(Show)する
 フォルダ一覧取得
 ドライブ詳細情報取得
 ファイル一覧取得
 テンポラリファイルパス取得
 継承コントロールの作り方
 フォルダの移動
 ファイルの移動
 My.Settingの利用
 MySQLCommandで抽出
 MySQLDeleteCommandで削除
 MySQLInsertCommandで挿入
 MySQLSelectCommandで抽出
 MySQLUpdateCommandで更新
 ネットワークに繋がってる?
 ネットワーク接続イベント取得
 固定長テキストファイルを読む
 Oracleストアドファンクション呼出1
 Oracleストアドファンクション呼出2
 OracleのLong Row型の画像を表示
 OracleのLong Row型をファイル保存
 Oracleパラメータクエリ実行
 ORACLE接続文字列生成
 VS2005でPing
 非同期でPing
 VB6のPrinterオブジェクトを.NETで
 Reportでテーブル形式表示
 ReportViewerでパラメータ設定
 メール送信
 非同期でメール送信
 メール送信(MailMessage利用)
 シリアル通信プログラム
 シリアル通信(文字列送信)
 二重起動の禁止
 特殊フォルダ取得
 スプラッシュウインドウ表示
 テーブルへ複数行の挿入
 CSVファイルをテーブルへ挿入
 テーブルへ複数行の挿入(マッピング)
 SqlBulkCopyで郵便番号データ処理
 SQL Server接続文字列生成
 Stopwatchで時間の計測
 システムサウンド再生
 CSVファイル読み込み
 固定長テキストファイルを読む2
 TableAdapterでTransaction
[VS2005] 非同期ファイルダウンロード 2005/08/24
ファイルダウンロードを行うには、System.NetネームスペースのWebClientクラスを利用すれば簡単に行うこと事ができます。 My.Computer.NetworkネームスペースのDownloadFileと同じだが、こちらは同期で実行されますが、 System.NetネームスペースのWebClientクラスには非同期で行えるメソッドなどが提供されています。

画面は、以下のようなフォームになります。

ダウンロード進捗状況変更時に発生するDownloadProgressChangedイベント・ダウンロードが完了した場合に発生するDownloadFileCompletedイベントを受け取れるように、以下を定義しておきます。

Private WithEvents _WebClient As New System.Net.WebClient

btnDownload_Clickイベントプロシージャは、以下のようになっています。

'--------------------------------------------------------------------------------
'「ダウンロード開始」ボタンクリック
'--------------------------------------------------------------------------------
Private Sub btnDownload_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles btnDownload.Click

    ''入力項目チェック
    If (txtDownloadUrl.Text.Length = 0Then
        MessageBox.Show("ダウンロードURLを入力してください。""エラー", _
                        MessageBoxButtons.OK, MessageBoxIcon.Error)
        txtDownloadUrl.Focus()
        Exit Sub
    End If
    If (txtSaveFilePath.Text.Length = 0Then
        MessageBox.Show("保存先を入力してください。""エラー", _
                        MessageBoxButtons.OK, MessageBoxIcon.Error)
        txtSaveFilePath.Focus()
        Exit Sub
    End If
    ''ファイル有無チェック
    If (My.Computer.FileSystem.FileExists(txtSaveFilePath.Text) = TrueThen
        If MessageBox.Show("ファイルが既に存在します。上書きしますか?""確認", _
                           MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = _
                           Windows.Forms.DialogResult.Cancel Then
            Exit Sub
        End If
    End If
    ''ダウンロード開始
    Dim uni As New Uri(txtDownloadUrl.Text)
    Try
        _WebClient.DownloadFileAsync(uni, txtSaveFilePath.Text)
        txtDownloadUrl.ReadOnly = True
        txtSaveFilePath.ReadOnly = True
        btnDownload.Enabled = False
        btnCancel.Enabled = True
    Catch ex As Exception
        MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

End Sub
DownloadFileAsyncメソッドが非同期で行う為のメソッドです。進捗状況DownloadProgressChangedイベント・処理が完了した場合には、DownloadFileCompletedイベントが発生します。

進捗状況DownloadProgressChangedイベントでは、プログレスバー・ダウンロードバイト数を表示するようにします。

'--------------------------------------------------------------------------------
'ダウンロード進捗状況変更イベント
'--------------------------------------------------------------------------------
Private Sub _WebClient_DownloadProgressChanged(ByVal sender As Object, _
                            ByVal e As System.Net.DownloadProgressChangedEventArgs) _
                            Handles _WebClient.DownloadProgressChanged
    pgbarDownload.Value = e.ProgressPercentage
    lblGetBytes.Text = e.BytesReceived.ToString & " / " & e.TotalBytesToReceive.ToString
End Sub
e.ProgressPercentageは現在ダウンロードの進捗状況のパーセント値(0から100)になっています。

処理が完了した場合に行う処理は、以下のようになっています。

'--------------------------------------------------------------------------------
'ダウンロード完了イベント
'--------------------------------------------------------------------------------
Private Sub _WebClient_DownloadFileCompleted(ByVal sender As Object, _
                            ByVal e As System.ComponentModel.AsyncCompletedEventArgs) _
                            Handles _WebClient.DownloadFileCompleted
    If (e.Cancelled = TrueThen
        lblGetBytes.Text = "ダウンロードは中止されました"
    ElseIf (e.Error Is NothingThen
        lblGetBytes.Text = "ダウンロードが完了しました"
    Else
        lblGetBytes.Text = e.Error.Message
    End If
    pgbarDownload.Value = 0
    txtDownloadUrl.ReadOnly = False
    txtSaveFilePath.ReadOnly = False
    btnDownload.Enabled = True
    btnCancel.Enabled = False
End Sub

また、処理を途中で中止したい場合は、CancelAsyncメソッドを呼び出すことで行えます。
サンプルを提供しますので、そちらで色々と試してみてください。

 サンプル
サンプルダウンロード(15KB)

Copyright © 2005 tadahiro higuchi. All Rights Reserved.