Я пишу фрагмент кода, который должен загрузить один файл в 1 Мб фрагментов. Я использовал тот же код, что и в этом вопросе: Download large file in small chunks in C# и преобразовал его в VB.NET.Загрузка файла в несколько фрагментов
Код, как и предыдущий, отлично работает и записывает файл на диск. Но кажется, что во втором веб-запросе что-то пошло не так. Для тестирования я загружаю PNG-файл с https://d13yacurqjgara.cloudfront.net/users/22/screenshots/631004/attachments/53012/wallpaper-retina-cinemadisplay.png, используя код VB.NET ниже.
Загруженный PNG, кажется, в порядке, а оставшееся изображение скремблировано.
Я увеличил defaultSize
и chunk
до 10 МБ, и файл загрузился отлично, но кажется, что что-то в цикле 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
Прежде всего, переключите 'Option Strict' на' On'! Я только что скопировал и вставил ваш код, и было несколько жалоб от VS ... – Grim
Вы действительно хотите преобразовать пример C#, поскольку автор сказал, что он все еще не работает. Я также вижу, что с ошибкой в математическом преобразовании тоже. – eric1825
Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –