public static async Task <StorageFile> DownloadDailyPicture() { string Path = await GetDailyPhotoPath().ConfigureAwait(true); try { if ((await ApplicationData.Current.LocalFolder.TryGetItemAsync("BingDailyPicture.jpg")) is StorageFile ExistFile) { if (string.IsNullOrWhiteSpace(Path)) { return(ExistFile); } StorageFile TempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("BingDailyPicture_Cache.jpg", CreationCollisionOption.ReplaceExisting); using (Stream TempFileStream = (await TempFile.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) { try { await Task.Run(() => { HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri($"https://www.bing.com{Path}")); using (WebResponse Response = Request.GetResponse()) using (Stream ResponseStream = Response.GetResponseStream()) { ResponseStream.CopyTo(TempFileStream); } }).ConfigureAwait(false); } catch { return(ExistFile); } using (Stream FileStream = await ExistFile.OpenStreamForReadAsync().ConfigureAwait(false)) { if (FileStream.ComputeMD5Hash() == TempFileStream.ComputeMD5Hash()) { return(ExistFile); } } } await TempFile.MoveAndReplaceAsync(ExistFile); return(ExistFile); } else { if (string.IsNullOrWhiteSpace(Path)) { return(null); } StorageFile BingDailyPictureFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("BingDailyPicture.jpg", CreationCollisionOption.ReplaceExisting); using (Stream FileStream = await BingDailyPictureFile.OpenStreamForWriteAsync().ConfigureAwait(false)) { await Task.Run(() => { HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri($"https://www.bing.com{Path}")); using (WebResponse Response = Request.GetResponse()) using (Stream ResponseStream = Response.GetResponseStream()) { ResponseStream.CopyTo(FileStream); } }).ConfigureAwait(false); } return(BingDailyPictureFile); } } catch { return(null); } }
public static async Task <StorageFile> UpdateBingPicture() { string Path = await GetDailyPhotoPath().ConfigureAwait(false); if ((await ApplicationData.Current.LocalFolder.TryGetItemAsync("BingDailyPicture.jpg")) is StorageFile ExistFile) { try { if (string.IsNullOrWhiteSpace(Path)) { return(ExistFile); } if (await CheckIfNeedToUpdate().ConfigureAwait(false)) { StorageFile TempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync($"BingDailyPicture_Cache_[{DateTime.Now:yyyy-MM-dd HH-mm-ss}].jpg", CreationCollisionOption.GenerateUniqueName); using (Stream TempFileStream = (await TempFile.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) { HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri($"https://www.bing.com{Path}")); using (WebResponse Response = await Request.GetResponseAsync().ConfigureAwait(false)) using (Stream ResponseStream = Response.GetResponseStream()) { await ResponseStream.CopyToAsync(TempFileStream).ConfigureAwait(false); } using (Stream FileStream = await ExistFile.OpenStreamForReadAsync().ConfigureAwait(false)) using (MD5 MD5Alg1 = MD5.Create()) using (MD5 MD5Alg2 = MD5.Create()) { Task <string> CalTask1 = MD5Alg1.GetHashAsync(FileStream); Task <string> CalTask2 = MD5Alg2.GetHashAsync(TempFileStream); string [] ResultArray = await Task.WhenAll(CalTask1, CalTask2).ConfigureAwait(false); if (ResultArray[0] == ResultArray[1]) { return(ExistFile); } } TempFileStream.Seek(0, SeekOrigin.Begin); using (StorageStreamTransaction Transaction = await ExistFile.OpenTransactedWriteAsync()) { await TempFileStream.CopyToAsync(Transaction.Stream.AsStreamForWrite()).ConfigureAwait(false); await Transaction.CommitAsync(); } } return(ExistFile); } else { return(ExistFile); } } catch (Exception ex) { LogTracer.Log(ex, $"An error was threw in {nameof(UpdateBingPicture)}"); return(ExistFile); } } else { try { if (string.IsNullOrWhiteSpace(Path)) { return(null); } StorageFile TempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync($"BingDailyPicture_Cache_[{DateTime.Now:yyyy-MM-dd HH-mm-ss}].jpg", CreationCollisionOption.GenerateUniqueName); using (Stream TempFileStream = (await TempFile.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) { HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(new Uri($"https://www.bing.com{Path}")); using (WebResponse Response = await Request.GetResponseAsync().ConfigureAwait(false)) using (Stream ResponseStream = Response.GetResponseStream()) { await ResponseStream.CopyToAsync(TempFileStream).ConfigureAwait(false); } StorageFile BingDailyPictureFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("BingDailyPicture.jpg", CreationCollisionOption.ReplaceExisting); using (StorageStreamTransaction Transaction = await BingDailyPictureFile.OpenTransactedWriteAsync()) { TempFileStream.Seek(0, SeekOrigin.Begin); await TempFileStream.CopyToAsync(Transaction.Stream.AsStreamForWrite()).ConfigureAwait(false); await Transaction.CommitAsync(); } return(BingDailyPictureFile); } } catch (Exception ex) { LogTracer.Log(ex, $"An error was threw in {nameof(UpdateBingPicture)}"); return(null); } } }
public static async Task <FileSystemStorageFile> GetBingPictureAsync() { string Path = await GetDailyPhotoPath().ConfigureAwait(false); if (await FileSystemStorageItemBase.OpenAsync(System.IO.Path.Combine(ApplicationData.Current.LocalFolder.Path, "BingDailyPicture.jpg")) is FileSystemStorageFile ExistFile) { try { if (string.IsNullOrWhiteSpace(Path)) { return(ExistFile); } if (await CheckIfNeedToUpdate()) { if (await FileSystemStorageItemBase.CreateAsync(System.IO.Path.Combine(ApplicationData.Current.TemporaryFolder.Path, $"BingDailyPicture_Cache_[{DateTime.Now:yyyy-MM-dd HH-mm-ss}].jpg"), StorageItemTypes.File, CreateOption.GenerateUniqueName) is FileSystemStorageFile TempFile) { using (FileStream TempFileStream = await TempFile.GetFileStreamFromFileAsync(AccessMode.ReadWrite)) { HttpWebRequest Request = WebRequest.CreateHttp(new Uri($"https://www.bing.com{Path}")); Request.Timeout = 10000; Request.ReadWriteTimeout = 10000; using (WebResponse Response = await Request.GetResponseAsync()) using (Stream ResponseStream = Response.GetResponseStream()) { await ResponseStream.CopyToAsync(TempFileStream); } using (Stream FileStream = await ExistFile.GetFileStreamFromFileAsync(AccessMode.Read)) using (MD5 MD5Alg1 = MD5.Create()) using (MD5 MD5Alg2 = MD5.Create()) { Task <string> CalTask1 = MD5Alg1.GetHashAsync(FileStream); Task <string> CalTask2 = MD5Alg2.GetHashAsync(TempFileStream); string[] ResultArray = await Task.WhenAll(CalTask1, CalTask2); if (ResultArray[0] == ResultArray[1]) { return(ExistFile); } } TempFileStream.Seek(0, SeekOrigin.Begin); using (StorageStreamTransaction Transaction = await ExistFile.GetTransactionStreamFromFileAsync()) { await TempFileStream.CopyToAsync(Transaction.Stream.AsStreamForWrite()); await Transaction.CommitAsync(); } } } else { LogTracer.Log($"Could not create temp file as needed in {nameof(GetBingPictureAsync)}"); } return(ExistFile); } else { return(ExistFile); } } catch (Exception ex) { LogTracer.Log(ex, $"An error was threw in {nameof(GetBingPictureAsync)}"); return(ExistFile); } } else { try { if (string.IsNullOrWhiteSpace(Path)) { return(null); } if (await FileSystemStorageItemBase.CreateAsync(System.IO.Path.Combine(ApplicationData.Current.TemporaryFolder.Path, $"BingDailyPicture_Cache_[{DateTime.Now:yyyy-MM-dd HH-mm-ss}].jpg"), StorageItemTypes.File, CreateOption.GenerateUniqueName) is FileSystemStorageFile TempFile) { using (Stream TempFileStream = await TempFile.GetFileStreamFromFileAsync(AccessMode.ReadWrite)) { HttpWebRequest Request = WebRequest.CreateHttp(new Uri($"https://www.bing.com{Path}")); Request.Timeout = 10000; Request.ReadWriteTimeout = 10000; using (WebResponse Response = await Request.GetResponseAsync()) using (Stream ResponseStream = Response.GetResponseStream()) { await ResponseStream.CopyToAsync(TempFileStream); } if (await FileSystemStorageItemBase.CreateAsync(System.IO.Path.Combine(ApplicationData.Current.LocalFolder.Path, "BingDailyPicture.jpg"), StorageItemTypes.File, CreateOption.ReplaceExisting) is FileSystemStorageFile BingDailyPictureFile) { using (StorageStreamTransaction Transaction = await BingDailyPictureFile.GetTransactionStreamFromFileAsync()) { TempFileStream.Seek(0, SeekOrigin.Begin); await TempFileStream.CopyToAsync(Transaction.Stream.AsStreamForWrite()); await Transaction.CommitAsync(); } return(BingDailyPictureFile); } else { LogTracer.Log($"Could not create BingPicture file as needed in {nameof(GetBingPictureAsync)}"); return(null); } } } else { LogTracer.Log($"Could not create temp file as needed in {nameof(GetBingPictureAsync)}"); return(null); } } catch (Exception ex) { LogTracer.Log(ex, $"An error was threw in {nameof(GetBingPictureAsync)}"); return(null); } } }