重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性
重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性
作者:webabcd
介绍
重新想象 Windows 8.1 Store Apps 之文件系统的新特性
- 简要说明 win8.1 中关于文件系统的增强
- “库”管理
- 管理以及使用索引
示例
1、简要说明 win8.1 中关于文件系统的增强
Demo.xaml
<Page x:Class="Windows81.FileSystem.Demo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.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="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <TextBlock FontSize="14.667" Text="本例简要说明了 win8.1 中关于文件系统的增强,详见后台代码中的说明" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
Demo.xaml.cs
/* * 简要说明 win8.1 中关于文件系统的增强 * * * 关于文件系统和选择器的基础请见: * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html */ using System; using System.Collections.Generic; using System.Linq; using Windows.Storage; using Windows.UI.Xaml.Controls; namespace Windows81.FileSystem { public sealed partial class Demo : Page { public Demo() { this.InitializeComponent(); Comment(); } private async void Comment() { // 1、在拆分屏幕状态下,打开文件选取器时,如果当前拆分屏有一定的宽度,则文件选取器会在当前拆分屏显示,而无需全屏显示 // 2、StorageFolder 和 StorageFile 都实现了 IStorageItem2 接口,其有一个 GetParentAsync() 方法用于获取当前 StorageFolder 或 StorageFile 的父文件夹 StorageFolder storageFolder = KnownFolders.DocumentsLibrary; // 在 win8.1 中访问 DocumentsLibrary 除了要添加 <Capability Name="documentsLibrary" /> 外,还要有相应的文件关联才行 IReadOnlyList<StorageFolder> folders = await storageFolder.GetFoldersAsync(); if (folders.Count > 0) { StorageFolder folder = folders.First(); StorageFolder parentFolder = await folder.GetParentAsync(); // 获取父亲文件夹(如果没有权限的话会返回 null) lblMsg.Text = parentFolder.Name; } // 3、StorageFolder 和 StorageFile 都实现了 IStorageItem2 接口,其有一个 IsEqual() 方法用于判断两个 IStorageItem2 是否相等 // 另外补充一个在 win8 中忘了写的一个知识点,判断一个 IStorageItem 是 StorageFolder 还是 StorageFile 可以通过 IsOfType(StorageItemTypes type) 方法来判断 // 4、KnownFolders 新增了两个属性,如下: // KnownFolders.CameraRoll // KnownFolders.Playlists // 5、新增了 StorageFolder.TryGetItemAsync(string name) 方法,不用再自己写 try catch 了(但是个别异常还是会抛出的,建议还是自己写帮助类吧) // StorageFolder.TryGetItemAsync(string name) // 6、文件激活应用程序时,其事件参数 FileActivatedEventArgs 新增了 NeighboringFilesQuery 属性,用于获取激活文件附近的文件们 // 7、文件选择器中集成了 OneDrive } } }
2、演示如何 添加/删除 “库”所包含的文件夹
StorageLibraryDemo.xaml
<Page x:Class="Windows81.FileSystem.StorageLibraryDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.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="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <Button Name="btnAddFolder" Content="增加一个文件夹引用到图片库" Click="btnAddFolder_Click" Margin="0 10 0 0" /> <Button Name="btnRemoveFolder" Content="从图片库移除之前添加的全部文件夹引用" Click="btnRemoveFolder_Click" Margin="0 10 0 0" /> </StackPanel> </Grid> </Page>
StorageLibraryDemo.xaml.cs
/* * 演示如何 添加/删除 “库”所包含的文件夹 * * StorageLibrary - 用于“库”管理 * StorageLibrary.GetLibraryAsync(KnownLibraryId libraryId) - 静态方法,用于获取指定的“库”,返回 StorageLibrary 类型的对象 * Folders - 当前库所包含的文件夹们 * SaveFolder - 当前库的默认文件夹 * RequestAddFolderAsync() - 添加文件夹到当前库 * RequestRemoveFolderAsync() - 从当前库移除指定的文件夹 * DefinitionChanged - 当前库所包含的文件夹发生变化时触发的事件 * * * 关于文件系统和选择器的基础请见: * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html */ using System; using System.Collections.Generic; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows81.FileSystem { public sealed partial class StorageLibraryDemo : Page { // 临时保存添加进图片库的文件夹 private List<StorageFolder> _addedFloders = new List<StorageFolder>(); public StorageLibraryDemo() { this.InitializeComponent(); this.Loaded += StorageLibraryDemo_Loaded; } async void StorageLibraryDemo_Loaded(object sender, RoutedEventArgs e) { // 注意:要想访问图片库,别忘了增加 <Capability Name="picturesLibrary" /> // 获取图片库的 StorageLibrary 对象 var picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures); // 当前库所包含的文件夹增多或减少时 picturesLibrary.DefinitionChanged += async (StorageLibrary innerSender, object innerEvent) => { await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { lblMsg.Text = "图片库所包含的文件夹如下:"; foreach (StorageFolder folder in picturesLibrary.Folders) // 当前库所包含的全部文件夹 { lblMsg.Text += Environment.NewLine; lblMsg.Text += folder.Path; } }); }; } // 增加一个文件夹引用到图片库 private async void btnAddFolder_Click(object sender, RoutedEventArgs e) { StorageLibrary picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures); // 弹出文件夹选择器,以选择需要添加到图片库的文件夹 StorageFolder addedFolder = await picturesLibrary.RequestAddFolderAsync(); if (addedFolder != null) { // 添加成功 _addedFloders.Add(addedFolder); } else { } } // 从图片库移除之前添加的全部文件夹引用 private async void btnRemoveFolder_Click(object sender, RoutedEventArgs e) { StorageLibrary picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures); foreach (StorageFolder folder in _addedFloders) { // 从图片库移除指定的文件夹引用 if (await picturesLibrary.RequestRemoveFolderAsync(folder)) { // 移除成功 } else { } } } } }
3、演示如何管理索引器,以及如何通过索引器获取数据
Indexer.xaml
<Page x:Class="Windows81.FileSystem.Indexer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows81.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="120 0 0 0"> <Button Name="btnAddToIndexer" Content="添加数据到索引器" Click="btnAddToIndexer_Click" /> <Button Name="btnRetrieveAllItems" Content="获取索引器中的全部数据" Click="btnRetrieveAllItems_Click" Margin="0 10 0 0" /> <Button Name="btnRetrieveMatchingItems" Content="按指定的查询条件获取索引器中的数据" Click="btnRetrieveMatchingItems_Click" Margin="0 10 0 0" /> <ScrollViewer Margin="0 10 0 0" Width="300" Height="400" HorizontalAlignment="Left"> <TextBlock Name="lblMsg" FontSize="14.667" /> </ScrollViewer> </StackPanel> </Grid> </Page>
Indexer.xaml.cs
/* * 演示如何管理索引器,以及如何通过索引器获取数据 * * * 关于文件系统和选择器的基础请见: * http://www.cnblogs.com/webabcd/archive/2013/04/25/3041569.html * http://www.cnblogs.com/webabcd/archive/2013/05/06/3062064.html * http://www.cnblogs.com/webabcd/archive/2013/05/09/3068281.html * http://www.cnblogs.com/webabcd/archive/2013/05/13/3075014.html * http://www.cnblogs.com/webabcd/archive/2013/05/16/3081181.html * http://www.cnblogs.com/webabcd/archive/2013/05/20/3087984.html * http://www.cnblogs.com/webabcd/archive/2013/05/23/3094179.html */ using System; using System.Collections.Generic; using Windows.Storage; using Windows.Storage.Search; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows81.FileSystem { public sealed partial class Indexer : Page { public Indexer() { this.InitializeComponent(); } // 添加数据到索引器 private async void btnAddToIndexer_Click(object sender, RoutedEventArgs e) { // 获取一个索引器(可以指定索引器的名字,从而达到对索引器分类的目的) var indexer = ContentIndexer.GetIndexer(); var content = new IndexableContent(); for (int i = 0; i < 100; i++) { content.Properties[SystemProperties.Title] = "Title: " + i.ToString().PadLeft(2, '0'); content.Properties[SystemProperties.Keywords] = "Keywords: " + i.ToString().PadLeft(2, '0'); // 多个用“;”隔开 content.Properties[SystemProperties.Comment] = "Comment: " + i.ToString().PadLeft(2, '0'); content.Id = "key" + i; // 标识,增加同标识的索引就是更新 // 增加一个索引(另外还有 Update 和 Delete 操作) await indexer.AddAsync(content); } } // 获取索引器中的全部数据 private void btnRetrieveAllItems_Click(object sender, RoutedEventArgs e) { ExecuteQueryHelper("*"); } // 按指定的查询条件获取索引器中的数据 private void btnRetrieveMatchingItems_Click(object sender, RoutedEventArgs e) { ExecuteQueryHelper("title:\"99\""); } // 按指定的 AQS 语法从索引器中查询数据 private async void ExecuteQueryHelper(string queryString) { lblMsg.Text = ""; var indexer = ContentIndexer.GetIndexer(); string[] propertyKeys = { SystemProperties.Title, SystemProperties.Keywords, SystemProperties.Comment }; // 通过 AQS 语法创建一个查询,关于 AQS 请参见:http://msdn.microsoft.com/zh-cn/library/windows/apps/aa965711.aspx var query = indexer.CreateQuery(queryString, propertyKeys); // 执行查询,并获取结果 var documents = await query.GetAsync(); foreach (var document in documents) { string itemString = "Key: " + document.Id + "\n"; foreach (var propertyKey in propertyKeys) { itemString += propertyKey + ": " + StringifyProperty(document.Properties[propertyKey]) + "\n"; } lblMsg.Text += itemString + "\n"; } } // 如果对象是一个字符串集合则用“;”做分隔符,然后以字符串形式输出 public string StringifyProperty(object property) { string propertyString = ""; if (property != null) { var vectorProperty = property as IEnumerable<string>; if (vectorProperty != null) { foreach (var prop in vectorProperty) { propertyString += prop + "; "; } } else { propertyString = property.ToString(); } } return propertyString; } } }
OK
[源码下载]