.NET谷歌硬盘SDK可恢复下载

.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

我正在使用GoogleDrive API从GoogleDrive下载文件,它工作正常,但我想添加暂停和恢复功能

我花了3天的时间研究和阅读谷歌的说明,试图达到这个目的,但我没有让它发挥作用

下载的文件始终损坏

这是我的代码:

    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文件,所以无法直接下载