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("Файлы старого пользователя удалены.");
        }