Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以多个块下载文件_C#_Asp.net_Vb.net - Fatal编程技术网

C# 以多个块下载文件

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

我正在写一段代码,应该下载一个1 MB块的文件。我使用了与此问题相同的代码:并将其转换为VB.NET

代码与前面的问题一样,工作正常,并将文件写入磁盘。但是第二个web请求似乎出了问题。为了测试,我正在使用下面的VB.NET代码下载一个PNG文件

下载的PNG在一半的时候看起来还不错,剩下的图像被打乱了

我将
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