private void ReloadFromNewUser(IReadOnlyList <FileDTO> files, IGoogleService newOwnerGoogleService, Action <FileDTO> callback) { _logger.LogMessage("Перезагружаем файлы от имени нового пользователя."); var rootId = GetUserInfo().RootFolderId; var filesToBeTrashed = new List <string>(); for (int i = 0; i < files.Count; i++) { var file = files[i]; var request = _driveService.Files.Get(file.Id); var stream = new MemoryStream(); // download _logger.LogMessage($"Скачиваем файл \"{file.Name}\" ({file.Id})."); _expBackoffPolicy.GrantedDelivery(() => request.Download(stream)); // upload _logger.LogMessage($"Загружаем файл {file.Name}."); stream.Seek(0, SeekOrigin.Begin); file.Parents = file.Parents?.Where(parent => parent != rootId).ToArray() ?? new string[] { }; if (file.Parents.Count == 0) { file.Parents = null; } _expBackoffPolicy.GrantedDelivery(() => { var loadedFileId = newOwnerGoogleService.UploadFile(file, stream); if (file.ExplicitlyTrashed.HasValue && file.ExplicitlyTrashed.Value && !string.IsNullOrWhiteSpace(loadedFileId)) { filesToBeTrashed.Add(loadedFileId); } callback(file); }); _logger.LogMessage($"Загрузили файл \"{file.Name}\"."); } // delete _logger.LogMessage("Удаляем файлы старого пользователя в пакетном режиме."); WrapBatchOperation(files, file => _driveService.Files.Delete(file.Id)); newOwnerGoogleService.TrashFiles(filesToBeTrashed); _logger.LogMessage("Файлы старого пользователя удалены."); }