FTP下载大于2GB的文件(VB.net) 缺少最后几个字节,文件损坏-赏金
我现在增加了一笔赏金来解决这个问题。我将整数类型更改为int64,这似乎解决了部分问题,但现在当它完成下载时,有时会丢失最后1-5个字节,这反过来会损坏文件,因此无法解压缩。是否有其他方法关闭流,以确保文件完全下载,并避免损坏?我尝试了这个简单的代码,但同样的问题也发生了FTP下载大于2GB的文件(VB.net) 缺少最后几个字节,文件损坏-赏金,vb.net,ftp,zip,unzip,large-files,Vb.net,Ftp,Zip,Unzip,Large Files,我现在增加了一笔赏金来解决这个问题。我将整数类型更改为int64,这似乎解决了部分问题,但现在当它完成下载时,有时会丢失最后1-5个字节,这反过来会损坏文件,因此无法解压缩。是否有其他方法关闭流,以确保文件完全下载,并避免损坏?我尝试了这个简单的代码,但同样的问题也发生了 Imports System.ComponentModel Imports System.Net Public Class Form1 Private Sub Form1_Load(sender As Object,
Imports System.ComponentModel
Imports System.Net
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
End Sub
Dim WithEvents WC As New WebClient
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
WC.DownloadFileAsync(New Uri("ftp://dmr-ftp-user:dmrpassword@5.44.137.84/ESStatistikListeModtag/ESStatistikListeModtag-20160327-094743.zip"), "C:\XML\ESStatistikListeModtag-20160327-094743.zip.zip")
End Sub
Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
ProgressBar1.Value = e.ProgressPercentage
If e.ProgressPercentage = 100 Then
MsgBox("File download - 100%") 'This message box does trigger once the download is complete, but file is still corrupted.
End If
End Sub
Private Sub WC_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
MsgBox("Complete") ' This message box doesn't trigger!
End Sub
End Class
老问题: 我正试图用我的vb.net应用程序从FTP服务器下载一个zip文件。我当前的源代码发布在下面。这适用于较小的文件,但当我超过2GB的限制时,会出现以下异常:
"Arithmetic operation resulted in an overflow"
这是一个大小约为2.5 GB的文件,每个文件的大小都略有增加(约20 MB),因此我需要一个能够处理大文件的解决方案,希望没有限制。最后,我想用这个程序解压这个文件,所以如果你有任何想法,你也可以发布这个。谢谢
Private Sub Download(ByVal filePath As String, ByVal fileName As String)
FTPSettings.IP = "0.0.0.0"
FTPSettings.UserID = "ftp-user"
FTPSettings.Password = "ftp-pass"
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 Int64
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
我以前在WebClient上也遇到过类似的问题,特别是在使用WithEvents语句时。 看看这样重新编写代码是否能解决问题:
Imports System.ComponentModel
Imports System.Net
Public Class Form1
Private wc As New WebClient()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
wc = New WebClient()
AddHandler wc.DownloadProgressChanged, Sub(s As Object, ByVal e As DownloadProgressChangedEventArgs)
Me.Invoke(New MethodInvoker(Sub() ProgressBar1.Value = e.ProgressPercentage))
End Sub
AddHandler wc.DownloadFileCompleted, Sub(s As Object, e As ComponentModel.AsyncCompletedEventArgs)
MsgBox("Complete")
End Sub
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
wc.DownloadFileAsync(New Uri("ftp://dmr-ftp-user:dmrpassword@5.44.137.84/ESStatistikListeModtag/ESStatistikListeModtag-20160327-094743.zip"), "C:\XML\ESStatistikListeModtag-20160327-094743.zip.zip")
End Sub
End Class
您没有告诉我们它发生在哪里,所以我猜它是
size+=readCount
将大小更改为Int64
并启用选项strict谢谢,我刚刚成功下载了整个文件!谢谢实际上,zip文件已损坏。我不再有2gb限制的问题,但当文件即将完成时,我遇到了一个新的异常:“基础连接已关闭:接收时发生意外错误。”这是一个免费的开源.NET zip库,您可以使用它首先压缩/解压文件,摆脱Control.CheckForIllegalCrossThreadCalls=False并正确封送对UI线程的任何UI访问。您声明该文件已损坏,但您确定正在使用的ZIP实用程序可以处理该大小的ZIP文件吗?请参阅:。