週に 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.
この問題の説明をお願いします。