public async Task ResumableChunkUpload(string filePath) { using (var client = DriveClient.GetInfo()) { try { FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); FilesResource.CreateMediaUpload request = new FilesResource.CreateMediaUpload(client, new Google.Apis.Drive.v3.Data.File { Name = "new File", Parents = new List <string>() { "1K46j8qE2sOiFAMNvSz21xFxgpVTYlcWm" }, }, stream, "video/mpeg4"); request.ChunkSize = 1024 * 1024; await request.InitiateSessionAsync(); Task <Google.Apis.Upload.IUploadProgress> uploadTask = request.UploadAsync(); for (var i = 0; i < 1000; i++) { System.Threading.Thread.Sleep(1000); Console.WriteLine(request.GetProgress().BytesSent); } await uploadTask; } catch (Exception e) { throw new Exception(e.Message + " " + e.StackTrace); } } }
private void UploadAll() { try { UserCredential credential; using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) { string credPath = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal); credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json"); credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; Console.WriteLine("Credential file saved to: " + credPath); } // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); // Define parameters of request. FilesResource.ListRequest listRequest = service.Files.List(); listRequest.PageSize = 10; listRequest.Fields = "nextPageToken, files(id, name)"; var request = service.Files.List(); request.Spaces = "appDataFolder"; request.Fields = "nextPageToken, files(id, name)"; request.PageSize = 10; var result = request.Execute(); var driveFiles = result.Files.ToList(); Directory.CreateDirectory("Budgets"); var localFiles = Directory.EnumerateFiles(_path, "*.sqlite").ToList(); foreach (var file in localFiles) { var fileName = Path.GetFileName(file); if (driveFiles.Any(x => x.Name.Equals(fileName) && File.GetLastWriteTime(file) > x.ModifiedTime)) { //UPDATE EXISTING ON DRIVE this.Dispatcher.Invoke((Action)(() => { _budgetList.Add(new Budget(fileName, Path.GetFullPath(file), Path.GetFileNameWithoutExtension(file))); var budget = _budgetList.First(x => x.Name.Equals(fileName)); budget.LoadAble = false; budget.State = "Uploading to drive"; ListViewBudgets.ItemsSource = _budgetList; ListViewBudgets.Items.Refresh(); })); var body = new Google.Apis.Drive.v3.Data.File { Name = Path.GetFileName(file), Description = "QuickBudget Database", MimeType = ".sqlite database", ModifiedTime = File.GetLastWriteTime(file) }; var byteArray = File.ReadAllBytes(file); MemoryStream stream = new MemoryStream(byteArray); string id = result.Files.First(x => x.Name.Equals(body.Name)).Id; FilesResource.UpdateMediaUpload req = service.Files.Update(body, id, stream, GetMimeType(Path.GetFileName(file))); req.Fields = "id"; req.Upload(); IUploadProgress progress = req.GetProgress(); this.Dispatcher.Invoke((Action)(() => { Budget budget = _budgetList.First(x => x.Name.Equals(fileName)); budget.LoadAble = true; budget.State = "Ready"; ListViewBudgets.ItemsSource = _budgetList; ListViewBudgets.Items.Refresh(); })); } else if (!driveFiles.Any(x => x.Name.Equals(fileName))) { //UPLOAD NON-EXISTING TO DRIVE this.Dispatcher.Invoke((Action)(() => { _budgetList.Add(new Budget(fileName, Path.GetFullPath(file), Path.GetFileNameWithoutExtension(file))); var budget = _budgetList.First(x => x.Name.Equals(fileName)); budget.LoadAble = false; budget.State = "Uploading to drive"; ListViewBudgets.ItemsSource = _budgetList; ListViewBudgets.Items.Refresh(); })); var body = new Google.Apis.Drive.v3.Data.File { Name = Path.GetFileName(file), Parents = new List <string>() { "appDataFolder" }, Description = "QuickBudget Database", MimeType = ".sqlite database", ModifiedTime = File.GetLastWriteTime(file) }; var byteArray = File.ReadAllBytes(file); MemoryStream stream = new MemoryStream(byteArray); FilesResource.CreateMediaUpload req = service.Files.Create(body, stream, GetMimeType(Path.GetFileName(file))); req.Fields = "id"; req.Upload(); IUploadProgress progress = req.GetProgress(); this.Dispatcher.Invoke((Action)(() => { var budget = _budgetList.First(x => x.Name.Equals(fileName)); budget.LoadAble = true; budget.State = "Ready"; ListViewBudgets.ItemsSource = _budgetList; ListViewBudgets.Items.Refresh(); })); } } } catch (Exception exception) when(exception is Google.GoogleApiException || exception is HttpRequestException) { bool retry = false; Dispatcher.Invoke((Action)(() => { YesNo yesNo = new YesNo("Quickbudget failed to connect to Google Drive. Do you want to try again?") { Owner = GetWindow(this) }; yesNo.ShowDialog(); if (yesNo.IsSuccesful) { retry = true; } })); if (retry) { UploadAll(); } else { //TODO load local } } }