重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性

简介: 原文:重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性[源码下载] 重新想象 Windows 8.1 Store Apps (83) - 文件系统的新特性 作者:webabcd介绍重新想象 Windows 8.
原文: 重新想象 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
[源码下载]

目录
相关文章
|
8月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
5月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
86 11
|
8月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
8月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
8月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
121 1
|
8月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
8月前
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
185 0
|
8月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
8月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
8月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例