.NET谷歌硬盘SDK可恢复下载
我正在使用GoogleDrive API从GoogleDrive下载文件,它工作正常,但我想添加暂停和恢复功能 我花了3天的时间研究和阅读谷歌的说明,试图达到这个目的,但我没有让它发挥作用 下载的文件始终损坏 这是我的代码:.NET谷歌硬盘SDK可恢复下载,.net,vb.net,google-drive-api,.net,Vb.net,Google Drive Api,我正在使用GoogleDrive API从GoogleDrive下载文件,它工作正常,但我想添加暂停和恢复功能 我花了3天的时间研究和阅读谷歌的说明,试图达到这个目的,但我没有让它发挥作用 下载的文件始终损坏 这是我的代码: Const KB As Integer = &H400 Dim ChunkSize As Integer = 256 * KB Dim FileRequest = Service.Files.Get(fileid) FileReque
Const KB As Integer = &H400
Dim ChunkSize As Integer = 256 * KB
Dim FileRequest = Service.Files.Get(fileid)
FileRequest.Fields = "createdTime,id,name,originalFilename,size,mimeType"
Dim Results = FileRequest.Execute()
Dim Size As Long = Results.Size
Dim client = FileRequest.Service.HttpClient
Using file = New FileStream(FilePath, FileMode.CreateNew, FileAccess.ReadWrite)
file.SetLength(Size)
Dim chunks = (Size / ChunkSize) + 1
For index As Long = 0 To chunks - 1
Dim request = FileRequest.CreateRequest()
Dim from = index * ChunkSize
Dim [to] = from + ChunkSize - 1
request.Headers.Range = New RangeHeaderValue(from, [to])
Dim response = Await client.SendAsync(request)
If response.StatusCode = Net.HttpStatusCode.PartialContent OrElse response.IsSuccessStatusCode Then
Using stream = Await response.Content.ReadAsStreamAsync()
file.Seek(from, SeekOrigin.Begin)
Await stream.CopyToAsync(file)
End Using
End If
Next
End Using
我还尝试了以下代码:
Dim FileRequest = Service.Files.Get(fileid)
FileRequest.Fields = "createdTime,id,name,originalFilename,size,mimeType"
Dim Results = FileRequest.Execute()
Dim FileDownloadSize As Long = Results.Size
Const KB As Integer = &H400
Dim ChunkSize As Integer = 256 * KB
Dim Stream As FileStream = New FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite)
Dim Request = Service.Files.Get(fileid)
Dim chunks = (FileDownloadSize / ChunkSize) + 1
Dim from = 0
Dim client = Request.Service.HttpClient
While from < FileDownloadSize
Dim [to] = from + ChunkSize
Dim GetRequest = Request.CreateRequest()
GetRequest.Headers.Range = New RangeHeaderValue(from, [to])
Dim response = Await client.SendAsync(GetRequest)
If (response.StatusCode = Net.HttpStatusCode.PartialContent Or response.IsSuccessStatusCode) Then
Using respstream = Await response.Content.ReadAsStreamAsync()
Stream.Seek(from, SeekOrigin.Begin)
Await respstream.CopyToAsync(Stream)
End Using
End If
from = [to] + 1
End While
Stream.Dispose()
Dim FileRequest=Service.Files.Get(fileid)
FileRequest.Fields=“createdTime,id,name,originalFilename,size,mimeType”
Dim Results=FileRequest.Execute()
Dim FileDownloadSize As Long=Results.Size
常量KB为整数=&H400
将ChunkSize设置为整数=256*KB
Dim Stream As FileStream=新FileStream(文件路径,FileMode.Create,FileAccess.ReadWrite)
Dim请求=Service.Files.Get(fileid)
Dim chunks=(FileDownloadSize/ChunkSize)+1
Dim from=0
Dim client=Request.Service.HttpClient
而从
所以我错过了什么 终于自己解决了 我下载的是文件元数据,不是它的内容,也不是读取下载的字节来继续中断下载 我会把它留在这里给任何想找的人
Function getCurrRowIndex()
Try
Dim row = From EachRow As DataGridViewRow In DGV.Rows
Where EachRow.Cells("GDrive_ID").Value = Me.CurrFileID
Select EachRow
Dim rowIndex = row.First.Index
Return rowIndex
Catch ex As Exception
Return -1
End Try
End Function
Async Sub DownloadFile(fileid as String , FilePath as String)
Try
Const KB As Integer = &H400
Dim chunkSize = 1024 * KB
Dim fileRequest = Service.Files.[Get](fileid)
fileRequest.Fields = "*"
fileRequest.SupportsAllDrives = True
Dim fileResponse = fileRequest.Execute()
Dim client = fileRequest.Service.HttpClient
Dim size = fileResponse.Size
Dim DownloadedBytesBefore As Long = 0
If IO.File.Exists(FilePath) Then ' Check if the same file downloaded before and get the download bytes to start from it
Dim myFile As New FileInfo(FilePath)
DownloadedBytesBefore = myFile.Length
End If
Using file = New FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
If (size / 1024 / 1024) > 150 Then
Dim chunks, from
chunks = ((size - DownloadedBytesBefore) / chunkSize) + 1
For index As Long = 0 To chunks - 1
from = DownloadedBytesBefore + (index * chunkSize)
Dim [to] = from + chunkSize
Dim range = New System.Net.Http.Headers.RangeHeaderValue(from, [to])
Dim request = fileRequest.CreateRequest()
request.Headers.Range = range
Dim response = Await client.SendAsync(request)
If response.StatusCode <> Net.HttpStatusCode.PartialContent AndAlso Not response.IsSuccessStatusCode Then
Console.WriteLine(response.ToString())
Continue For
End If
If Not IsNothing(DGV) Then
Dim rowIndex As Integer = getCurrRowIndex()
If DGV("Status", rowIndex).Value <> "Pausing" Then
DGV("Status", rowIndex).Value = "Downloading"
DGV("BytesDownloaded", rowIndex).Value = Math.Round(CDbl(from / 1024), 2) & " Kb / " & Math.Round(CDbl(size / 1024), 2) & " Kb"
Dim percentage As Double = (from / size * 100)
DGV("Progress", rowIndex).Value = Math.Round(percentage, 2) & "%"
Else
DGV("Status", rowIndex).Value = "Paused"
While DGV("Status", rowIndex).Value = "Paused"
Threading.Thread.Sleep(1000)
End While
End If
End If
Console.WriteLine($"ChunkIndex: {index}; File Size: {size}; Bytes Downloaded: {from} ({Convert.ToDecimal(from) / (1024D * 1024D)}) MB; ")
file.Seek(from, SeekOrigin.Begin)
Await fileRequest.DownloadRangeAsync(file, range)
Next
Else
AddHandler fileRequest.MediaDownloader.ProgressChanged, AddressOf ProgChanged
fileRequest.DownloadWithStatus(file)
End If
If Not IsNothing(DGV) Then
Dim rowIndex As Integer = getCurrRowIndex()
DGV("Status", rowIndex).Value = "Completed"
DGV("Progress", rowIndex).Value = "100%"
DGV("BytesDownloaded", rowIndex).Value = Math.Round(CDbl(size / 1024 / 1024), 2) & " Mb / " & Math.Round(CDbl(size / 1024 / 1024), 2) & " Mb"
End If
End Using
Catch ex As Exception
If Not IsNothing(DGV) Then
Dim rowIndex As Integer = getCurrRowIndex()
DGV("Status", rowIndex).Value = "Failed"
End If
End Try
End Sub
函数getCurrRowIndex()
尝试
Dim row=作为DGV.Rows中的DataGridViewRow从每个箭头开始
其中EachRow.Cells(“GDrive_ID”).Value=Me.CurrFileID
选择每个箭头
Dim rowIndex=行.First.Index
返回行索引
特例
返回-1
结束尝试
端函数
异步子下载文件(fileid为字符串,FilePath为字符串)
尝试
常量KB为整数=&H400
Dim chunkSize=1024*KB
Dim fileRequest=Service.Files.[Get](文件ID)
fileRequest.Fields=“*”
fileRequest.SupportsAllDrives=True
Dim fileResponse=fileRequest.Execute()
Dim client=fileRequest.Service.HttpClient
Dim size=fileResponse.size
Dim DownloadedBytesBefore,只要=0
如果IO.File.Exists(FilePath),则“检查之前下载的文件是否相同,并从中获取下载字节
将myFile设置为新文件信息(文件路径)
DownloadedBytesBefore=myFile.Length
如果结束
使用file=newfilestream(FilePath、FileMode.OpenOrCreate、FileAccess.ReadWrite)
如果(大小/1024/1024)>150,则
模糊的块,从
chunks=((大小-下载字节之前)/chunkSize)+1
对于长=0到块-1的索引
from=下载字节数+之前(索引*块大小)
Dim[to]=from+chunkSize
Dim range=New System.Net.Http.Headers.RangeHeaderValue(从,[到])
Dim request=fileRequest.CreateRequest()
request.Headers.Range=范围
Dim response=WAIT client.SENDASNC(请求)
如果response.StatusCode Net.HttpStatusCode.PartialContent和也没有response.IsSuccessStatusCode,则
Console.WriteLine(response.ToString())
继续
如果结束
如果不是零(DGV),则
Dim rowIndex作为整数=GetCurrowIndex()
如果DGV(“状态”,行索引)。值“暂停”,则
DGV(“状态”,行索引)。Value=“下载”
DGV(“字节下载”,行索引).Value=Math.Round(CDbl(from/1024),2)和“Kb/”&Math.Round(CDbl(size/1024),2)和“Kb”
双精度尺寸百分比=(自/尺寸*100)
DGV(“进度”,行索引).Value=Math.Round(百分比,2)和“%”
其他的
DGV(“状态”,行索引)。Value=“暂停”
而DGV(“状态”,行索引).Value=“暂停”
线程。线程。睡眠(1000)
结束时
如果结束
如果结束
Console.WriteLine($“ChunkIndex:{index};文件大小:{Size};下载字节:{from}({Convert.ToDecimal(from)/(1024D*1024D)})MB;”)
file.Seek(from,SeekOrigin.Begin)
等待fileRequest.DownloadRangeAync(文件,范围)
下一个
其他的
AddHandler fileRequest.MediaDownloader.ProgressChanged,AddressOf ProgChanged
fileRequest.DownloadWithStatus(文件)
如果结束
如果不是零(DGV),则
Dim rowIndex作为整数=GetCurrowIndex()
DGV(“状态”,行索引)。Value=“已完成”
DGV(“进度”,行索引)。Value=“100%”
DGV(“字节下载”,行索引).Value=Math.Round(CDbl(size/1024/1024),2)和“Mb/”&Math.Round(CDbl(size/1024/1024),2)和“Mb”
如果结束
终端使用
特例
如果不是零(DGV),则
Dim rowIndex作为整数=GetCurrowIndex()
DGV(“状态”,行索引)。Value=“失败”
如果结束
结束尝试
端接头
看看@DaImTo,我的问题不是直接下载文件,而是分块下载。我正在下载大约46GB的tar文件,所以无法直接下载