#if NETFX_CORE using System; using System.Collections.Generic; using System.Threading.Tasks; using System.IO; using System.Linq; using System.Text; using Windows.Storage; using Windows.Storage.Streams; using Windows.Foundation; namespace BestHTTP.PlatformSupport.IO { public static class FileHelper { internal const string LOCAL_FOLDER = "ms-appdata:///local/"; internal const string ROAMING_FOLDER = "ms-appdata:///roaming/"; internal const string TEMP_FOLDER = "ms-appdata:///temp/"; internal const string STORE_FOLDER = "isostore:/"; public static Stream OpenFileForReading(string uri) { return FileHelper.OpenFileForReading(FileHelper.GetFileForPathOrURI(uri)); } public static Stream OpenFileForReading(System.Uri uri) { Task task = WindowsRuntimeSystemExtensions.AsTask(StorageFile.GetFileFromApplicationUriAsync(uri)); task.Wait(); if (task.Status != TaskStatus.RanToCompletion) throw new Exception("Filed to open file " + uri.ToString()); else return FileHelper.OpenFileForReading(task.Result); } public static Stream OpenFileForWriting(string uri) { string fileName = Path.GetFileName(uri); Task task1 = WindowsRuntimeSystemExtensions.AsTask(FileHelper.GetFolderForPathOrURI(uri).CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting)); task1.Wait(); if (task1.Status != TaskStatus.RanToCompletion) throw new Exception("Failed to open the file"); Task task2 = WindowsRuntimeSystemExtensions.AsTask(task1.Result.OpenAsync(FileAccessMode.ReadWrite)); task2.Wait(); if (task2.Status != TaskStatus.RanToCompletion) throw new Exception("Failed to open the file"); else return WindowsRuntimeStreamExtensions.AsStreamForWrite((IOutputStream)task2.Result); } internal static StorageFolder GetFolderForURI(string uri) { uri = uri.ToLower(); StorageFolder storageFolder1; if (uri.StartsWith("ms-appdata:///local/")) { storageFolder1 = ApplicationData.Current.LocalFolder; uri = uri.Replace("ms-appdata:///local/", ""); } else if (uri.StartsWith("ms-appdata:///roaming/")) { storageFolder1 = ApplicationData.Current.RoamingFolder; uri = uri.Replace("ms-appdata:///roaming/", ""); } else { if (!uri.StartsWith("ms-appdata:///temp/")) throw new Exception("Unsupported URI: " + uri); storageFolder1 = ApplicationData.Current.TemporaryFolder; uri = uri.Replace("ms-appdata:///temp/", ""); } string[] strArray = uri.Split(new char[1] { '/' }); for (int index = 0; index < strArray.Length - 1; ++index) { Task> task = WindowsRuntimeSystemExtensions.AsTask>(storageFolder1.CreateFolderQuery().GetFoldersAsync()); task.Wait(); if (task.Status != TaskStatus.RanToCompletion) throw new Exception("Failed to find folder: " + strArray[index]); IReadOnlyList result = task.Result; bool flag = false; foreach (StorageFolder storageFolder2 in (IEnumerable)result) { if (storageFolder2.Name == strArray[index]) { storageFolder1 = storageFolder2; flag = true; break; } } if (!flag) throw new Exception("Folder not found: " + strArray[index]); } return storageFolder1; } internal static StorageFolder GetFolderForPathOrURI(string path) { if (System.Uri.IsWellFormedUriString(path, UriKind.RelativeOrAbsolute)) return FileHelper.GetFolderForURI(path); IAsyncOperation folderFromPathAsync = StorageFolder.GetFolderFromPathAsync(Path.GetDirectoryName(path)); WindowsRuntimeSystemExtensions.AsTask(folderFromPathAsync).Wait(); return folderFromPathAsync.GetResults(); } internal static StorageFile GetFileForPathOrURI(string path) { IAsyncOperation source = !System.Uri.IsWellFormedUriString(path, UriKind.RelativeOrAbsolute) ? StorageFile.GetFileFromPathAsync(path) : StorageFile.GetFileFromApplicationUriAsync(new System.Uri(path)); WindowsRuntimeSystemExtensions.AsTask(source).Wait(); return source.GetResults(); } internal static Stream OpenFileForReading(StorageFile file) { Task task = WindowsRuntimeSystemExtensions.AsTask(file.OpenAsync(FileAccessMode.Read)); task.Wait(); if (task.Status != TaskStatus.RanToCompletion) throw new Exception("Failed to open file!"); else return WindowsRuntimeStreamExtensions.AsStreamForRead((IInputStream)task.Result); } internal static byte[] ReadEntireFile(StorageFile file) { Task task = WindowsRuntimeSystemExtensions.AsTask(FileIO.ReadBufferAsync((IStorageFile)file)); task.Wait(); if (task.Status != TaskStatus.RanToCompletion) throw new Exception("Failed to read file"); IBuffer result = task.Result; DataReader dataReader = DataReader.FromBuffer(result); byte[] numArray = new byte[result.Length]; dataReader.ReadBytes(numArray); return numArray; } } } #endif