C# 以多个块下载文件
我正在写一段代码,应该下载一个1 MB块的文件。我使用了与此问题相同的代码:并将其转换为VB.NET 代码与前面的问题一样,工作正常,并将文件写入磁盘。但是第二个web请求似乎出了问题。为了测试,我正在使用下面的VB.NET代码下载一个PNG文件 下载的PNG在一半的时候看起来还不错,剩下的图像被打乱了 我将C# 以多个块下载文件,c#,asp.net,vb.net,C#,Asp.net,Vb.net,我正在写一段代码,应该下载一个1 MB块的文件。我使用了与此问题相同的代码:并将其转换为VB.NET 代码与前面的问题一样,工作正常,并将文件写入磁盘。但是第二个web请求似乎出了问题。为了测试,我正在使用下面的VB.NET代码下载一个PNG文件 下载的PNG在一半的时候看起来还不错,剩下的图像被打乱了 我将defaultSize和chunk增加到10MB,文件下载非常完美,但似乎For/Next循环中的某些内容截断或污染了数据 有没有想过是什么导致了这一切 Private Const defa
defaultSize
和chunk
增加到10MB,文件下载非常完美,但似乎For/Next循环中的某些内容截断或污染了数据
有没有想过是什么导致了这一切
Private Const defaultSize As Long = 1048576
Private chunk As Long = 1048576
Private offset As Long = 0
Private Function downloadFile(ByVal url As String, ByVal filename As String) As Boolean
Dim size As Long = getSize(url)
Dim blockSize As Integer = Convert.ToInt32(size / defaultSize)
Dim remainder As Integer = Convert.ToInt32(size Mod defaultSize)
If remainder > 0 Then
blockSize += 1
End If
Dim fileStream As FileStream = File.Create("C:\mydirectory\" & filename)
For i As Integer = 0 To blockSize - 1
If i = blockSize - 1 Then
chunk = remainder
End If
Dim req As HttpWebRequest = HttpWebRequest.Create(url)
req.Method = WebRequestMethods.Http.Get
req.AddRange(Convert.ToInt32(offset), Convert.ToInt32(chunk + offset))
Dim resp As HttpWebResponse = req.GetResponse()
Using respStream As Stream = resp.GetResponseStream
Dim buffer(4096) As Byte
Dim bytesRead As Integer
Do
bytesRead = respStream.Read(buffer, 0, 4096)
If bytesRead > 0 Then fileStream.Write(buffer, 0, bytesRead)
Loop While bytesRead > 0
End Using
offset += chunk
resp.Close()
resp.Dispose()
Next
fileStream.Close()
Return True
End Function
Private Function getSize(ByVal url As String) As Long
Dim req As WebRequest = WebRequest.Create(url)
req.Method = WebRequestMethods.Http.Head
Dim resp As WebResponse = req.GetResponse
Return Long.Parse(resp.ContentLength)
End Function
除了整理一点代码(我认为您无论如何都会这样做,因为您是从C#转换过来的),只需做一点小小的更改就可以让它完美地工作 线路
offset += chunk
应该是
offset += chunk + 1
这就解决了这个问题,因为offset
从0开始,并且在下一个循环中向其添加块大小,因此添加一个兆字节并从那里开始。您希望从最后一个兆字节之后的字节继续!
我确实开始解释它是如何工作的,但是我举的例子不起作用。。。所以我无法解释!也许其他人可以;这与
req.AddRange
有关-您指定的是一个范围,而不是总数。关于代码转换的一个问题
Convert.ToInt32(size / defaultSize)
这与C代码中的代码相同,VB忽略了分号。然而,它并不考虑“/”操作符可以在两种语言中用整数除法返回不同值的细微差别。
变量大小和默认大小都是长整数。在C#中除两个整数时,结果是一个整数,小数被切碎且不四舍五入。在VB中,除以两个整数,结果强制为十进制类型,然后四舍五入
例如,如果size和defaultSize的值分别为68和10
VB
C#
这可能会对我没有采用的算法产生怎样的影响,因为原始代码仍然不起作用。首先,将
选项Strict
切换到On
!我刚刚复制并粘贴了您的代码,VS提出了一些投诉……您确定要转换c#示例,因为作者说它仍然不起作用。我可以看到一个数学转换失败。我已经编辑了你的标题。请参见“”,其中一致意见是“不,他们不应该”。如果希望在VB中获得与C#相同的整数除法结果,可以使用反斜杠\作为运算符,而不是正斜杠/除法运算符。反斜杠在VB中返回一个整数结果,余数被删除。谢谢!虽然主要的问题是偏移量不正确,但代码转换中的这种疏忽肯定会成为下一个问题。使用这两种建议,代码似乎可以完美地工作。
Dim result As Integer = Convert.ToInt32(size / defaultSize) 'VB result 7
int result = Convert.ToInt32(size / defaultSize); // C# result 6