// Copyright (c) Richasy. All rights reserved. using System; using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using Newtonsoft.Json; using Richasy.Bili.Toolkit.Interfaces; using Windows.Storage; using Windows.Storage.Pickers; namespace Richasy.Bili.Toolkit.Uwp { /// /// File Toolkit. /// public class FileToolkit : IFileToolkit { /// public Task ReadLocalDataAsync(string fileName, string defaultValue = "{}", string folderName = "") => Task.Run(async () => { var path = string.IsNullOrEmpty(folderName) ? $"ms-appdata:///local/{fileName}" : $"ms-appdata:///local/{folderName}/{fileName}"; var content = defaultValue; try { var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(path)) .AsTask(); var fileContent = await FileIO.ReadTextAsync(file) .AsTask(); if (!string.IsNullOrEmpty(fileContent)) { content = fileContent; } } catch (FileNotFoundException) { } if (typeof(T) == typeof(string)) { return (T)content.Clone(); } else { return JsonConvert.DeserializeObject(content); } }); /// public Task WriteLocalDataAsync(string fileName, T data, string folderName = "") => Task.Run(async () => { var folder = ApplicationData.Current.LocalFolder; if (!string.IsNullOrEmpty(folderName)) { folder = await folder.CreateFolderAsync(folderName, CreationCollisionOption.OpenIfExists) .AsTask(); } var writeContent = string.Empty; if (data is string) { writeContent = data.ToString(); } else { writeContent = JsonConvert.SerializeObject(data); } var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists) .AsTask(); await FileIO.WriteTextAsync(file, writeContent) .AsTask(); }); /// public Task DeleteLocalDataAsync(string fileName, string folderName = "") => Task.Run(async () => { var folder = ApplicationData.Current.LocalFolder; if (!string.IsNullOrEmpty(folderName)) { folder = await folder.CreateFolderAsync(folderName) .AsTask(); } var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists) .AsTask(); await file.DeleteAsync() .AsTask(); }); /// public async Task> OpenLocalFileAndReadAsync(params string[] types) { var picker = new FileOpenPicker(); picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; var typeReg = new Regex(@"^\.[a-zA-Z0-9]+$"); foreach (var type in types) { if (type == "*" || typeReg.IsMatch(type)) { picker.FileTypeFilter.Add(type); } else { throw new InvalidCastException("Invalid file extension."); } } var file = await picker.PickSingleFileAsync(); if (file != null) { var content = await FileIO.ReadTextAsync(file); return new Tuple(content, file.FileType); } return null; } } }