1

週に 1 回、大きな zip ファイルを自動的にダウンロードしようとしています。これまでのところ、新しいファイルがアップロードされているかどうかを確認でき、ダウンロードを開始する準備ができていますが、いくつかの問題が発生しています。ダウンロードするファイルは 2.2 GB (Zip) を超えるため、かなり大きなファイルであり、コードの新しいピースをテストするたびに、ファイルが再度ダウンロードされるまで 5 ~ 10 分待つ必要があります。一番下にもっと複雑なコードがあり、最初に簡単なコードがあります。最後の数バイトが転送されると、どちらも同じエラーになります。

Try
    My.Computer.Network.DownloadFile(
"ftp://dmr-ftp-user:dmrpassword@5.44.137.84/ESStatistikListeModtag/ESStatistikListeModtag-20160110-093818.zip",
"C:\ZipDownload\Test.zip")
Catch ex As Exception
   MsgBox(ex.Message)
End Try

はい、これは ftp ホストへの実際のログイン情報です。したがって、考えられる解決策を投稿する前にコードをテストしたい場合は、お気軽に。ファイルのダウンロードがちょうど完了しようとすると、次の例外が発生します。

Exception: The underlying connection was closed: An unexpected error occurred on a receive.

オンラインで見つけたこの少し複雑なバージョンも試しました。

Private Sub Download(ByVal filePath As String, ByVal fileName As String)
        FTPSettings.IP = "5.44.137.84"
        FTPSettings.UserID = "dmr-ftp-user"
        FTPSettings.Password = "dmrpassword"
        Dim reqFTP As FtpWebRequest = Nothing
        Dim ftpStream As Stream = Nothing
        Try
            Dim outputStream As New FileStream(filePath + "\" + fileName, FileMode.Create)
            reqFTP = DirectCast(FtpWebRequest.Create(New Uri("ftp://" + FTPSettings.IP + "/" + fileName)), FtpWebRequest)
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
            reqFTP.UseBinary = True
            reqFTP.Credentials = New NetworkCredential(FTPSettings.UserID, FTPSettings.Password)
            Dim response As FtpWebResponse = DirectCast(reqFTP.GetResponse(), FtpWebResponse)
            ftpStream = response.GetResponseStream()
            Dim cl As Long = response.ContentLength
            Dim bufferSize As Integer = 2048
            Dim readCount As Integer
            Dim buffer As Byte() = New Byte(bufferSize - 1) {}
            Dim size As Int64

            readCount = ftpStream.Read(buffer, 0, bufferSize)
            While readCount > 0
                outputStream.Write(buffer, 0, readCount)
                readCount = ftpStream.Read(buffer, 0, bufferSize)

                If readCount = bufferSize Then
                    size += readCount
                    Label1.Text = size
                    Label1.Refresh()
                End If

              End While

            ftpStream.Close()
            outputStream.Close()
            response.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
            If ftpStream IsNot Nothing Then
                ftpStream.Close()
                ftpStream.Dispose()
            End If
            Throw New Exception(ex.Message.ToString())
        End Try
    End Sub
    Public NotInheritable Class FTPSettings
        Private Sub New()
        End Sub
        Public Shared Property IP() As String
            Get
                Return m_IP
            End Get
            Set(ByVal value As String)
                m_IP = value
            End Set
        End Property
        Private Shared m_IP As String
        Public Shared Property UserID() As String
            Get
                Return m_UserID
            End Get
            Set(ByVal value As String)
                m_UserID = value
            End Set
        End Property
        Private Shared m_UserID As String
        Public Shared Property Password() As String
            Get
                Return m_Password
            End Get
            Set(ByVal value As String)
                m_Password = value
            End Set
        End Property
        Private Shared m_Password As String
    End Class
End Class

これらのソリューションはどちらも問題なく機能しているように見えます。テスト フォルダーのファイル サイズの増加を、数秒間フリーズしてから同じ例外を返す最後の最後まで追跡できます。

Exception: The underlying connection was closed: An unexpected error occurred on a receive.

この問題の説明をお願いします。

4

0 に答える 0