public static async Task <byte[]> DownloadFileToByteArray(string url)
        {
            // Create Drive API service.
            _service = GoogleDriveService;
            // Attempt download
            // Iterate through file-list and find the relevant file
            FilesResource.ListRequest listRequest = _service.Files.List();
            listRequest.Fields = "nextPageToken, files(id, name, mimeType, originalFilename, size)";
            Google.Apis.Drive.v3.Data.File lobjGoogleFile = null;
            foreach (var item in listRequest.Execute().Files)
            {
                if (url.IndexOf(string.Format("id={0}", item.Id)) > -1)
                {
                    Console.WriteLine(string.Format("{0}: {1}", item.OriginalFilename, item.MimeType));
                    lobjGoogleFile = item;
                    break;
                }
            }

            FilesResource.ExportRequest request = _service.Files.Export(lobjGoogleFile.Id, GOOGLE_MYMETYPE_PDF);
            Console.WriteLine(request.MimeType);
            using MemoryStream lobjMS = new MemoryStream();
            await request.DownloadAsync(lobjMS);

            // At this point the MemoryStream has a length of zero?
            lobjMS.Position = 0;
            return(lobjMS.ToArray());
        }
        public static async Task DownloadFileById(string id, string lstrDownloadFile)
        {
            // Create Drive API service.
            _service = GoogleDriveService;
            var file = _service.Files.Get(id).Execute();

            FilesResource.ExportRequest request = _service.Files.Export(file.Id, GOOGLE_MYMETYPE_PDF);
            Console.WriteLine(request.MimeType);
            MemoryStream lobjMS = new MemoryStream();
            await request.DownloadAsync(lobjMS);

            // At this point the MemoryStream has a length of zero?

            lobjMS.Position = 0;
            var lobjFS = new System.IO.FileStream(lstrDownloadFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
            await lobjMS.CopyToAsync(lobjFS);
        }
        static async Task GetDriveFile(DriveFile driveFileObject, DriveService driveService, string token, dynamic config, string courseName = "Unknown")
        {
            var fileRequest = driveService.Files.Get(driveFileObject.Id);

            fileRequest.OauthToken = token;
            var stream = new MemoryStream();

            fileRequest.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) => {
                switch (progress.Status)
                {
                case Google.Apis.Download.DownloadStatus.Completed:
                {
                    Console.WriteLine(String.Format("Downloaded {0}.", driveFileObject.Title));
                    SaveStream(stream, String.Format(@".\output\{0}\{1}", courseName, driveFileObject.Title));
                    break;
                }

                case Google.Apis.Download.DownloadStatus.Failed:
                {
                    try {
                        var driveFile = fileRequest.Execute();
                        if (config.exportmimes.ContainsKey(driveFile.MimeType))
                        {
                            FilesResource.ExportRequest exportRequest = driveService.Files.Export(driveFile.Id, (string)config.exportmimes[driveFile.MimeType]);
                            exportRequest.OauthToken = token;
                            exportRequest.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress exportProgress) => {
                                switch (exportProgress.Status)
                                {
                                case Google.Apis.Download.DownloadStatus.Completed:
                                {
                                    Console.WriteLine(String.Format("Downloaded {0}.{1}.", driveFileObject.Title, (string)config.mimeextensions[exportRequest.MimeType]));
                                    SaveStream(stream, String.Format(@".\output\{0}\{1}.{2}", courseName, driveFileObject.Title, (string)config.mimeextensions[exportRequest.MimeType]));
                                    break;
                                }

                                case Google.Apis.Download.DownloadStatus.Failed:
                                {
                                    Console.WriteLine(String.Format("Download failed on file {0}.\n{2}\n{1}", driveFileObject.Title, exportProgress.Exception.Message, progress.Exception.Message));
                                    break;
                                }
                                }
                            };
                            exportRequest.DownloadAsync(stream);
                        }
                        else
                        {
                            Console.WriteLine(String.Format("Download failed on file {0}.\n{1}", driveFileObject.Title, progress.Exception.Message));
                        }
                    }
                    catch (Exception e) {
                        Console.WriteLine(String.Format("Download failed on file {0}.\n{1}", driveFileObject.Title, e.Message));
                    }

                    break;
                }
                }
            };

            // Synchronous for now
            await fileRequest.DownloadAsync(stream);
        }