using FileManager_UWP.Model; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using Windows.Storage; using Windows.Storage.FileProperties; using Type = FileManager_UWP.Model.Type; namespace FileManager_UWP.Service { internal interface IFileService { /// /// 获得可显示的目录 /// /// 路径 /// 文件和文件夹列表 Task> GetDisplayFileFolderList(string path); } /// /// 负责提供本地文件及文件夹访问服务 /// internal class FileService: IFileService { private async Task> GetVirtualFolderAsync(string path) { // var splitList = path.Split('\\'); //var virtualFolderName = path.Substring(0, path.LastIndexOf('\\')); //path = path.Substring(path.LastIndexOf('\\')); var directoryName = Path.GetDirectoryName(path); var virtualFolderName = path.Substring(path.LastIndexOf('\\') + 1); if (directoryName == null) throw new FileNotFoundException(); StorageFolder folder; folder = await StorageFolder.GetFolderFromPathAsync(directoryName); FolderSetting folderSetting = await FolderSetting.GetInstance(folder); VirtualFolder virtualFolder = folderSetting.VirtualFolders.Find(x => x.Name == virtualFolderName); if (virtualFolder == null) throw new FileNotFoundException(); var displayFileFolderItems = new List { new DisplayableSpecial( "..", directoryName, Type.Folder, await IconServer.GetFolderIcon(ThumbnailMode.ListView, 32) ) }; foreach (var virtualFilderItem in virtualFolder.Includes) { displayFileFolderItems.AddRange( await GetRegularFilesAsync(virtualFilderItem, false) ); } return displayFileFolderItems; } /// /// 获得普通文件夹中的文件 /// /// /// /// private async Task> GetRegularFilesAsync(string path, bool withParent = true) { StorageFolder folder = null; try { folder = await StorageFolder.GetFolderFromPathAsync(path); } catch (System.UnauthorizedAccessException) { throw; } catch (Exception e) { Debug.WriteLine(e.Message + " " + path + " try to get Virtual Folder"); try { return await GetVirtualFolderAsync(path); } catch (Exception) { Debug.WriteLine(e.Message); throw; } } // 打开文件夹 var displayFileFolderItems = new List(); if (withParent) displayFileFolderItems.Add(await DisplayableFolder.GetParentAsync(folder)); // 读取配置文件 FolderSetting folderSetting = await FolderSetting.GetInstance(folder); foreach (var virtualFolder in folderSetting.VirtualFolders) { displayFileFolderItems.Add(new DisplayableSpecial( virtualFolder.Name, folder.Path + "\\" + virtualFolder.Name, Type.VirtualFolder, await IconServer.GetFolderIcon(ThumbnailMode.ListView, 32))); } IReadOnlyList folders = await folder.GetFoldersAsync(); IReadOnlyList files = await folder.GetFilesAsync(); //displayFileFolderItems.AddRange(folders // .Select(async i => await DisplayFileFolderItem.GetInstance(i)) // .Select(i => i.Result) //); //displayFileFolderItems.AddRange(files // .Select(async i => await DisplayFileFolderItem.GetInstance(i)) // .Select(i => i.Result) //); try { foreach (var file in folders) displayFileFolderItems.Add( await DisplayableFolder.GetInstanceAsync(file)); foreach (var file in files) displayFileFolderItems.Add( await DisplayableFile.GetInstanceAsync(file)); } catch (Exception e) { Debug.WriteLine("Exception at appending dispalyFileFolder " + e.Message); } return displayFileFolderItems; } /// /// 获得磁盘驱动器列表 /// /// private async Task> GetDiskDrivesAsync() { var drives = DriveInfo.GetDrives(); var ans = new List(); foreach (var d in drives) ans.Add(await DisplayableDisk.GetInstance(d)); return ans; } /// /// 获得可显示的目录 /// /// 路径 /// 文件和文件夹列表 public async Task> GetDisplayFileFolderList(string path) { try { List ans; if (path == "/") ans = await GetDiskDrivesAsync(); else ans = await GetRegularFilesAsync(path); ans.Sort(); return ans; } catch (Exception) { throw; } } } }