ファイルダウンロードの成功と失敗で・・・ への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ウッチー  (小学生) 投稿日時 2009/12/29 22:34:05
ご返答ありがとうごいざいます。
お二方のご返答を参考にして以下のようなクラスを作成してみました。
Imports System
Imports System.Net
Imports System.Threading

Class Class1

    Shared Sub top(ByVal i As Integer)
        Dim url As New Uri("http://***/top.txt")
        Dim downfile As String = "./top.txt"
            Dim wc As New WebClient()
            wc = New System.Net.WebClient()
            'イベントハンドラの作成 
            AddHandler wc.DownloadProgressChanged, _
                AddressOf downloadClient_DownloadProgressChanged
            AddHandler wc.DownloadFileCompleted, _
                AddressOf downloadClient_DownloadFileCompleted

        wc.DownloadFileAsync(url, downfile)
        Console.WriteLine("ダウンロード完了:{0}", i)
    End Sub

    Shared Sub ini(ByVal i As Integer)
        Dim url As New Uri("http://***/top.txt")
        Dim wc As New WebClient()
        Dim downfile As String = "./top.txt"
            wc = New System.Net.WebClient()
            'イベントハンドラの作成 
            AddHandler wc.DownloadProgressChanged, _
                AddressOf downloadClient_DownloadProgressChanged
            AddHandler wc.DownloadFileCompleted, _
                AddressOf downloadClient_DownloadFileCompleted

        wc.DownloadFileAsync(url, downfile)
    End Sub

    Private Sub downloadClient_DownloadProgressChanged(ByVal sender As Object, _
        ByVal e As System.Net.DownloadProgressChangedEventArgs)
        Console.WriteLine( _
            "{0}% ({1}byte 中 {2}byte) ダウンロードが終了しました。", _
            e.ProgressPercentage, e.TotalBytesToReceive, e.BytesReceived)
    End Sub

    Private Sub downloadClient_DownloadFileCompleted(ByVal sender As Object, _
            ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        If Not (e.Error Is NothingThen
            Console.WriteLine("エラー:{0}", e.Error.Message)
        Else
            If e.Cancelled Then
                Console.WriteLine("キャンセルされました。")
            Else
                Console.WriteLine("ダウンロード完了")
            End If
        End If
    End Sub

    ' 別スレッドで実行されるメソッド 
    Shared Sub worker(ByVal i As Object)
        top(CType(i, Integer))
    End Sub


    Shared Sub main()

        ' 最大同時接続数 
        ServicePointManager.DefaultConnectionLimit = 2 ' デフォルト 

        Dim t(9) As Thread

        Console.WriteLine("-- 事前ダウンロード開始 --")
        top(-1)
        ' 出力:ダウンロード完了:-1 

        Console.WriteLine("-- 一斉ダウンロード開始 --")

        For i As Integer = 0 To 9
            t(i) = New Thread(AddressOf worker)
            t(i).Start(i)
        Next
        ' 出力例: 
        ' ダウンロード完了:0 
        ' ダウンロード完了:1 
        ' ダウンロード完了:4 
        ' ダウンロード完了:6 
        ' ダウンロード完了:9 
        ' ダウンロード完了:8 
        ' ダウンロード完了:3 
        ' ダウンロード完了:5 
        ' ダウンロード完了:7 
        ' ダウンロード完了:2 
    End Sub
End Class


・・・なのですがどうしても分からない部分があり、その部分をご教授願います。

14,16,29,31行目の
                '14,29行目 
                AddressOf downloadClient_DownloadProgressChanged
                '16,31行目 
                AddressOf downloadClient_DownloadFileCompleted

がエラーになってしまいます。

普通のフォームを使用したものではエラーにはならなかったのですが・・・。

重ねてご迷惑をおかけしますが、宜しくお願いします。
投稿者 流れ者  (その他) 投稿日時 2009/12/25 01:05:55
こんにちは。

下記のアドレス
http://dobon.net/vb/dotnet/internet/downloadfile.html
が、かなり参考になると思います。

エラーチェックもされてますし、ダウンロード状況を表示するようにもなっています。
投稿者 Keno31o  (小学生) 投稿日時 2009/12/24 06:35:31
てっきりPCの中にあるものを調べるのかと思ってました・・w
http://www.atmarkit.co.jp/fdotnet/dotnettips/817httpstatus/httpstatus.htmlを改良してみましたが、存在しないと、例外で停止してしまいます。

Imports System
Imports System.Net

Public Class Form1
    Dim Internet_ini As Net.WebClient = New Net.WebClient()
    Dim inid As String = "http://***/cats.ini"
    Dim Internet_rtf As Net.WebClient = New Net.WebClient()
    Dim rtf As String = "http://***/top.rtf"
    Dim url As String = "http://www.yahoo.co.jp/hoge.html"



   

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        WebRequest.DefaultWebProxy = Nothing

        Dim statusCode As HttpStatusCode = GetStatusCode(rtf)

        Dim code As Integer = CType(statusCode, Integer)

        If code >= 400 Then
            'Richtextbox1にerror.rtfを 仮にerrorと表示
            RichTextBox1.Text = "ERROR"
        Else
            Internet_rtf.DownloadFile(rtf, Me.RichTextBox1.Text)
            Dim ini As String = Internet_ini.DownloadString(inid)

        End If
    End Sub

    Public Shared Function GetStatusCode(ByVal url As String) As HttpStatusCode
        
        Dim rtf As String = "http://***/top.rtf"

        Dim statusCode As HttpStatusCode

        Dim req As HttpWebRequest = _
                  CType(WebRequest.Create(rtf), HttpWebRequest)
      
        Dim res As HttpWebResponse = Nothing
        Try
            res = CType(req.GetResponse(), HttpWebResponse)
            statusCode = res.StatusCode
        Catch ex As WebException
            res = CType(ex.Response, HttpWebResponse)
            If Not res Is Nothing Then
                statusCode = res.StatusCode
            Else
                Throw
            End If
        Finally
            If Not res Is Nothing Then
                res.Close()
            End If
        End Try
        Return statusCode
    End Function
    
End Class

どうやって改良したらいいのか・・・
徹夜で考えます。もう少しお時間ください。
投稿者 Keno31o  (小学生) 投稿日時 2009/12/24 06:11:52
こんにちは。
ファイルが存在しているかどうかはDirというものでわかりますよ。

       If PathIsDirectory(rtf) Then

            Internet_rtf.DownloadFile(rtf, Me.RichTextBox1.Text)
            Dim ini As String = Internet_ini.DownloadString(inid)

        Else
            RichTextBox1.Text = "ERROR"
        End If

(未確認です...)
ネットは、http://dobon.net/vb/dotnet/internet/httpstatuscode.htmlを参考にどうぞ。
投稿者 ウッチー  (小学生) 投稿日時 2009/12/24 03:52:07
お久しぶりです。
今回は、下のコードで
    Dim Internet_ini As Net.WebClient = New Net.WebClient()
    Dim inid As String = "http://***/cats.ini"
    Dim Internet_rtf As Net.WebClient = New Net.WebClient()
    Dim rtf As String = "http://***/top.rtf"

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load

        Internet_rtf.DownloadFile(rtf, Me.RichTextBox1.Text)
        Dim ini As String = Internet_ini.DownloadString(inid)

    End Sub

サーバー側にアクセスできなかったり、ファイルが存在しなかったときに、RichTextBox1にerror.rtfを表示させたいのですがうまくいきません。

また同様にファイルが取得出来なかったときに、メッセージボックスを表示する方法を教えて欲しいのです。

どうかご教授お願いします。