背水一戰 Windows 10 (85) - 文件系統: 獲取文件夾和文件, 分組文件夾, 排序過濾文件夾和文件, 搜索文件
作者:webabcd
介紹
背水一戰 Windows 10 之 文件系統
- 獲取文件夾和文件
- 分組文件夾
- 排序過濾文件夾和文件
- 搜索文件
示例
1、演示如何獲取文件夾和文件
FileSystem/FolderFileAccess.xaml
<Page x:Class="Windows10.FileSystem.FolderFileAccess" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.FileSystem" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" /> <Button Name="btnGetFolder" Content="獲取文件夾" Click="btnGetFolder_Click" Margin="5" /> <Button Name="btnGetFolderFile" Content="獲取文件夾和文件" Click="btnGetFolderFile_Click" Margin="5" /> </StackPanel> </Grid> </Page>
FileSystem/FolderFileAccess.xaml.cs
/* * 演示如何獲取文件夾和文件 * * KnownFolders - 已知文件夾 * GetFolderForUserAsync(User user, KnownFolderId folderId) - 獲取指定用戶的指定文件夾的 StorageFolder 對象 * user - 指定用戶,傳 null 則為當前用戶(關於 User 相關請參見 /UserAndAccount/UserInfo.xaml) * folderId - 指定文件夾,一個 KnownFolderId 類型的枚舉值,常用的有 RemovableDevices, DocumentsLibrary, PicturesLibrary, VideosLibrary, MusicLibrary 等,其他更多的請參見文檔 * * StorageFolder - 文件夾操作類 * GetFileAsync(string name) - 在當前 StorageFolder 下獲取指定名字的 StorageFile * 不存在的話會拋出 FileNotFoundException 異常 * GetFolderAsync(string name) - 在當前 StorageFolder 下獲取指定名字的 StorageFolder * 不存在的話會拋出 FileNotFoundException 異常 * GetItemAsync(string name) - 在當前 StorageFolder 下獲取指定名字的 IStorageItem * 不存在的話會拋出 FileNotFoundException 異常 * GetFilesAsync() - 獲取當前 StorageFolder 下的 StorageFile 集合 * GetFoldersAsync() = 獲取當前 StorageFolder 下的 StorageFolder 集合 * GetItemsAsync() - 獲取當前 StorageFolder 下的 IStorageItem 集合 * IsOfType(StorageItemTypes type) - 判斷當前的 IStorageItem 是 StorageItemTypes.File 還是 StorageItemTypes.Folder * GetParentAsync() - 獲取當前 StorageFolder 的父 StorageFolder,找不到就返回 null * IsEqual(IStorageItem item) - 判斷兩個 StorageFolder 是否相等 * TryGetItemAsync(string name) - 在當前 StorageFolder 下獲取指定名字的 IStorageItem * 不存在的話會也不會拋出 FileNotFoundException 異常,而是會返回 null * GetFolderFromPathAsync(string path) - 靜態方法,用於獲取指定路徑的 StorageFolder 對象(沒有權限的話會拋出異常) * GetIndexedStateAsync() - 返回當前文件夾的被系統索引的狀態(一個 IndexedState 類型的枚舉) * * StorageFile - 文件操作類 * IsOfType(StorageItemTypes type) - 判斷當前的 IStorageItem 是 StorageItemTypes.File 還是 StorageItemTypes.Folder * GetParentAsync() - 獲取當前 StorageFile 的父 StorageFolder,找不到就返回 null * IsEqual(IStorageItem item) - 判斷兩個 StorageFile 是否相等 * * * 注: * 1、如果想要獲取任意路徑的 StorageFolder 或 StorageFile 的話,可以通過 Picker 讓用戶選擇 * 2、對於處理文件夾和文件來說,最好都放到 try catch 中,因為不定會有什么異常呢 * 3、StorageFile 和 StorageFolder 有很多共同的接口(File 代表文件,Folder 代表文件夾,Item 代表文件和文件夾),詳見文檔 * 4、對於處理 KnownFolders 已知文件夾來說 * 需要在 Package.appxmanifest 中配置 <Capability Name="removableStorage" />, <Capability Name="picturesLibrary" />, <Capability Name="videosLibrary" />, <Capability Name="musicLibrary" />, <Capability Name="documentsLibrary" /> * 5、對於處理 KnownFolderId.DocumentsLibrary 中的文件來說 * 需要在 Package.appxmanifest 對相關類型的文件配置好文件關聯 */ using System; using System.Collections.Generic; using System.IO; using Windows.Storage; using Windows.UI.Popups; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows10.FileSystem { public sealed partial class FolderFileAccess : Page { public FolderFileAccess() { this.InitializeComponent(); } // 獲取文件夾 private async void btnGetFolder_Click(object sender, RoutedEventArgs e) { lblMsg.Text = ""; // 獲取當前用戶的“圖片庫”的 StorageFolder 對象 StorageFolder picturesFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.PicturesLibrary); // 獲取“圖片庫”所包含的全部文件夾 IReadOnlyList<StorageFolder> folderList = await picturesFolder.GetFoldersAsync(); foreach (StorageFolder storageFolder in folderList) { lblMsg.Text += " " + storageFolder.Name; lblMsg.Text += Environment.NewLine; } // 在當前 StorageFolder 下獲取指定名字的 StorageFolder,不存在的話會拋出 FileNotFoundException 異常 try { await picturesFolder.GetFolderAsync("aabbcc"); } catch (FileNotFoundException) { await new MessageDialog("在“圖片庫”中找不到名為“aabbcc”的文件夾").ShowAsync(); } // 在當前 StorageFolder 下獲取指定名字的 IStorageItem,不存在的話會也不會拋出 FileNotFoundException 異常,而是會返回 null IStorageItem item = await picturesFolder.TryGetItemAsync("aabbcc"); if (item == null) { await new MessageDialog("在“圖片庫”中找不到名為“aabbcc”的文件夾或文件").ShowAsync(); } } // 獲取文件夾和文件 private async void btnGetFolderFile_Click(object sender, RoutedEventArgs e) { lblMsg.Text = ""; // 獲取當前用戶的“圖片庫”的 StorageFolder 對象 StorageFolder picturesFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.PicturesLibrary); // 獲取“圖片庫”所包含的全部文件夾和文件 IReadOnlyList<IStorageItem> storageItems = await picturesFolder.GetItemsAsync(); foreach (IStorageItem storageItem in storageItems) { if (storageItem.IsOfType(StorageItemTypes.Folder)) // 是文件夾 { StorageFolder storageFolder = storageItem as StorageFolder; lblMsg.Text += "folder: " + storageFolder.Name; lblMsg.Text += Environment.NewLine; } else if (storageItem.IsOfType(StorageItemTypes.File)) // 是文件 { StorageFile storageFile = storageItem as StorageFile; lblMsg.Text += "file: " + storageFile.Name; lblMsg.Text += Environment.NewLine; } } } } }
2、演示如何分組文件夾,排序過濾文件夾和文件,搜索文件
FileSystem/FolderFileQuery.xaml
<Page x:Class="Windows10.FileSystem.FolderFileQuery" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.FileSystem" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" /> <Button Name="btnFolderGroup" Content="分組文件夾" Click="btnFolderGroup_Click" Margin="5" /> <Button Name="btnFolderFileOrderFilter" Content="排序過濾文件夾和文件" Click="btnFolderFileOrderFilter_Click" Margin="5" /> <Button Name="btnFileSearch" Content="搜索文件" Click="btnFileSearch_Click" Margin="5" /> </StackPanel> </Grid> </Page>
FileSystem/FolderFileQuery.xaml.cs
/* * 演示如何分組文件夾,排序過濾文件夾和文件,搜索文件 * * StorageFolder - 文件夾操作類。與分組,排序,過濾,搜索相關的接口如下(File 代表文件,Folder 代表文件夾,Item 代表文件和文件夾) * public StorageFileQueryResult CreateFileQuery(); * public StorageFileQueryResult CreateFileQuery(CommonFileQuery query); * public StorageFileQueryResult CreateFileQueryWithOptions(QueryOptions queryOptions); * public StorageFolderQueryResult CreateFolderQuery(); * public StorageFolderQueryResult CreateFolderQuery(CommonFolderQuery query); * public StorageFolderQueryResult CreateFolderQueryWithOptions(QueryOptions queryOptions); * public StorageItemQueryResult CreateItemQuery(); * public StorageItemQueryResult CreateItemQueryWithOptions(QueryOptions queryOptions); * public IAsyncOperation<IReadOnlyList<StorageFile>> GetFilesAsync(CommonFileQuery query, uint startIndex, uint maxItemsToRetrieve); * public IAsyncOperation<IReadOnlyList<StorageFile>> GetFilesAsync(CommonFileQuery query); * public IAsyncOperation<IReadOnlyList<StorageFolder>> GetFoldersAsync(CommonFolderQuery query, uint startIndex, uint maxItemsToRetrieve); * public IAsyncOperation<IReadOnlyList<StorageFolder>> GetFoldersAsync(CommonFolderQuery query); * public IAsyncOperation<IReadOnlyList<IStorageItem>> GetItemsAsync(uint startIndex, uint maxItemsToRetrieve); * public bool AreQueryOptionsSupported(QueryOptions queryOptions); * public bool IsCommonFolderQuerySupported(CommonFolderQuery query); * public bool IsCommonFileQuerySupported(CommonFileQuery query); * * CommonFolderQuery - 文件夾分組方式枚舉 * * CommonFileQuery - 文件排序方式枚舉 * * QueryOptions - 查詢參數 * 可以通過 FolderDepth 指定是只查詢根目錄還是查詢根目錄和所有子目錄 * 可以通過 IndexerOption 指定查詢時,如何使用系統索引 * 可以指定 CommonFolderQuery * 可以指定 CommonFileQuery 和需要過濾的文件類型 * 通過 SetPropertyPrefetch(), SetThumbnailPrefetch() 可以預加載指定的屬性和指定規格的縮略圖(耗費更多的資源,加快檢索速度) * * StorageFileQueryResult, StorageFolderQueryResult, StorageItemQueryResult - 查詢實例 * 可以執行這個查詢,可以獲取這個查詢的結果的總數,可以按指的 startIndex 和 maxNumber 執行這個查詢,可以設置新的查詢參數 * * * 注:以上接口不再一一說明,看看下面的示例代碼就基本都明白了 */ using System; using System.Collections.Generic; using Windows.Storage; using Windows.Storage.Search; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows10.FileSystem { public sealed partial class FolderFileQuery : Page { public FolderFileQuery() { this.InitializeComponent(); } // 分組文件夾 private async void btnFolderGroup_Click(object sender, RoutedEventArgs e) { lblMsg.Text = ""; StorageFolder picturesFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.PicturesLibrary); // 文件夾按月分組查詢參數,其他多種分組方式請參見 CommonFolderQuery 枚舉 CommonFolderQuery folderQuery = CommonFolderQuery.GroupByMonth; // 判斷一下 picturesFolder 是否支持指定的查詢參數 if (picturesFolder.IsCommonFolderQuerySupported(folderQuery)) { // 創建查詢 StorageFolderQueryResult queryResult = picturesFolder.CreateFolderQuery(folderQuery); // 執行查詢 IReadOnlyList<StorageFolder> folderList = await queryResult.GetFoldersAsync(); foreach (StorageFolder storageFolder in folderList) // 這里的 storageFolder 就是按月份分組后的月份文件夾(當然,物理上並沒有月份文件夾) { IReadOnlyList<StorageFile> fileList = await storageFolder.GetFilesAsync(); lblMsg.Text += storageFolder.Name + " (" + fileList.Count + ")"; lblMsg.Text += Environment.NewLine; foreach (StorageFile file in fileList) // 月份文件夾內的文件 { lblMsg.Text += " " + file.Name; lblMsg.Text += Environment.NewLine; } } } } // 排序過濾文件夾和文件 private async void btnFolderFileOrderFilter_Click(object sender, RoutedEventArgs e) { lblMsg.Text = ""; StorageFolder picturesFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.PicturesLibrary); // 設置需要過濾的文件的擴展名 List<string> fileTypeFilter = new List<string>(); fileTypeFilter.Add(".txt"); // 創建一個查詢參數,可以指定文件的排序方式和文件的類型過濾。文件的各種排序方式請參見 CommonFileQuery 枚舉 QueryOptions query = new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter); // 默認是正序的,如果需要倒序的話可以這樣寫 SortEntry se = query.SortOrder[0]; se.AscendingOrder = false; query.SortOrder.RemoveAt(0); query.SortOrder.Add(se); // 判斷一下 picturesFolder 是否支持指定的查詢參數 if (picturesFolder.AreQueryOptionsSupported(query)) { // 創建查詢 StorageItemQueryResult queryResult = picturesFolder.CreateItemQueryWithOptions(query); // 執行查詢 IReadOnlyList<IStorageItem> storageItems = await queryResult.GetItemsAsync(); foreach (IStorageItem storageItem in storageItems) { if (storageItem.IsOfType(StorageItemTypes.Folder)) // 是文件夾 { StorageFolder storageFolder = storageItem as StorageFolder; lblMsg.Text += "folder: " + storageFolder.Name; lblMsg.Text += Environment.NewLine; } else if (storageItem.IsOfType(StorageItemTypes.File)) // 是文件 { StorageFile storageFile = storageItem as StorageFile; lblMsg.Text += "file: " + storageFile.Name; lblMsg.Text += Environment.NewLine; } } } } // 搜索文件 private async void btnFileSearch_Click(object sender, RoutedEventArgs e) { // 准備在“音樂庫”中進行搜索 StorageFolder musicFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.MusicLibrary); // 准備搜索所有類型的文件 List<string> fileTypeFilter = new List<string>(); fileTypeFilter.Add("*"); // 搜索的查詢參數 QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderByDate, fileTypeFilter); // 指定 AQS 字符串(Advanced Query Syntax),參見 http://msdn.microsoft.com/zh-cn/library/windows/apps/aa965711.aspx queryOptions.UserSearchFilter = "五月天"; // 搜索根目錄和所有子目錄 queryOptions.FolderDepth = FolderDepth.Deep; // 根據指定的參數創建一個查詢 StorageFileQueryResult fileQuery = musicFolder.CreateFileQueryWithOptions(queryOptions); lblMsg.Text = "在音樂庫中搜索“五月天”,結果如下:"; lblMsg.Text += Environment.NewLine; // 開始搜索,並返回檢索到的文件列表 IReadOnlyList<StorageFile> files = await fileQuery.GetFilesAsync(); if (files.Count == 0) { lblMsg.Text += "什么都沒搜到"; } else { foreach (StorageFile file in files) { lblMsg.Text += file.Name; lblMsg.Text += Environment.NewLine; } } } } }
OK
[源碼下載]