Получить downloadUrl файлов в драйвере Google в консольном приложении C # - PullRequest
0 голосов
/ 04 мая 2018

Я работаю, чтобы подключиться к Google Drive, перечислить все файлы в любых форматах, а затем загрузить его физически на моем жестком диске. Я использовал методы, которые Google API подготовил для меня. Но я думаю, как я работал, у меня просто есть доступ к содержимому каждого файла, и я не могу этого сделать.

Не могли бы вы помочь мне узнать, какая конфигурация мне нужна для этого?

public static Google.Apis.Drive.v2.Data.FileList ListFiles(DriveService service, FilesListOptionalParms optional = null)
        {
            try
            {

                if (service == null)
                    throw new ArgumentNullException("service");


                var request = service.Files.List();

                request = (FilesResource.ListRequest)SampleHelpers.ApplyOptionalParms(request, optional);

                return request.Execute();
            }
            catch (Exception ex)
            {
                throw new Exception("Request Files.List failed.", ex);
            }
        }

Я называю этот метод и для каждого файла, который я хочу загрузить на свой ПК:

 FileList files_list = DriveListExample.ListFiles(service, null);
            if (files_list.Items.Count != 0)
            {
                foreach (var file in files_list.Items)
                {                        
                    DriveListExample.DownloadFile(service, file, DownloadDirectoryName);




                    Console.WriteLine("\"{0}\" ", file.Title + " downloaded completely!");


                }
            }

здесь, если я могу получить доступ к downloadUrl каждого файла, я могу проверить другой способ загрузки. Но это ноль, и это мой метод загрузки:

public static void DownloadFile (служба DriveService, файл File, строка saveTo) {

    var request = service.Files.Get(file.Id);
    var stream = new System.IO.MemoryStream();
    Console.WriteLine(file.FileExtension);


    request.MediaDownloader.ProgressChanged += (IDownloadProgress progress) =>
    {
        switch (progress.Status)
        {
            case DownloadStatus.Downloading:
                {
                    Console.WriteLine(progress.BytesDownloaded);
                    break;
                }
            case DownloadStatus.Completed:
                {
                    Console.WriteLine("Download complete.");
                    SaveStream(stream, saveTo);
                    break;
                }
            case DownloadStatus.Failed:
                {
                    Console.WriteLine("Download failed.");
                    break;
                }
        }
    };

    try
    {
        request.Download(stream);
    }
    catch (Exception ex)

    {
        Console.Write("Error: " + ex.Message);
    }

}

В этом процессе состояние загрузки не удалось. Я также проверил области действия и обнаружил, что с помощью этих строк я могу просто загрузить файлы, созданные в этом приложении:

private static readonly string[] Scopes = new[] { DriveService.Scope.DriveFile, DriveService.Scope.Drive };

Но мне нужно после перечисления всех файлов, я могу скачать каждый из них.

Не могли бы вы помочь мне с решением или другими рабочими кодами?

1 Ответ

0 голосов
/ 19 мая 2018

Вам необходимо использовать правильное имя файла и обрабатывать файлы Google Doc:

 public static void DownloadFile(DriveService service, Google.Apis.Drive.v2.Data.File file, string saveTo)
        {

            var request = service.Files.Get(file.Id);
            var stream = new System.IO.MemoryStream();

            // Add a handler which will be notified on progress changes.
            // It will notify on each chunk download and when the
            // download is completed or failed.
            request.MediaDownloader.ProgressChanged += (IDownloadProgress progress) =>
            {
                switch (progress.Status)
                {
                    case DownloadStatus.Downloading:
                        {
                            Console.WriteLine(progress.BytesDownloaded);
                            break;
                        }
                    case DownloadStatus.Completed:
                        {
                            Console.WriteLine("Download complete.");
                            SaveStream(stream, saveTo + @"/" + file.Title);
                            break;
                        }
                    case DownloadStatus.Failed:
                        {
                            if (file.ExportLinks.Any())
                                SaveStream(new HttpClient().GetStreamAsync(file.ExportLinks.FirstOrDefault().Value).Result, saveTo + @"/" + file.Title);
                            Console.WriteLine("Download failed.");
                            break;
                        }
                }
            };

            try
            {
                request.Download(stream);
            }
            catch (Exception ex)

            {
                Console.Write("Error: " + ex.Message);
            }

        }
...