Я пишу настольный электронный ридер для Google Книг в качестве упражнения, используя API книг Google.
Я застрял при попытке определить размер книги перед ее загрузкой.Я хочу добавить индикатор выполнения, чтобы указать ход загрузки.
Я использую Google.Apis.Download.MediaDownloader
, чтобы выполнить загрузку, и, хотя мне это удалось, я не могу найти какую-либо информацию в Интернетеотносительно получения размера файла перед загрузкой.
Единственная информация, которую я могу найти, - это как определить размер файла при загрузке с Google Диска.Но, насколько я могу судить, код не может быть использован для API книг.
Ниже приведена текущая версия моей функции загрузки для контекста:
private async Task Download(string VolID)
{
UserCredential credential;
using (FileStream stream = new FileStream(ClientSecret_Path, FileMode.Open, FileAccess.Read))
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { BooksService.Scope.Books },
"user", CancellationToken.None, new FileDataStore("Books.ListMyLibrary"));
}
BooksService service = new BooksService(new BaseClientService.Initializer
{
HttpClientInitializer = credential,
ApplicationName = "Desktop eReader",
});
Google.Apis.Books.v1.Data.Volume volume = await service.Volumes.Get(VolID).ExecuteAsync();
string bookPath = filePath + volume.VolumeInfo.Title + ".epub";
if (!File.Exists(bookPath)) //Only DL if not already done.
{
MediaDownloader downloader = new MediaDownloader(service);
MemoryStream dlStream = new MemoryStream();
downloader.ProgressChanged += Downloader_ProgressChanged;
downloader.ChunkSize = 51200; //ping every 50Kbs
/*
* Add logic in here to determine the file size.
* Maybe add a download confirmation pop-up.
*
*/
await downloader.DownloadAsync(volume.AccessInfo.Epub.DownloadLink, dlStream);
using (FileStream dlStream2 = new FileStream(bookPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
{
dlStream.WriteTo(dlStream2);
}
}
int Chapter = 0;
int ChapterPos = 0;
//insert logic here to find last reading position
ContinueBook(bookPath, Chapter, ChapterPos); //function that will later be used to display last reading position
}