zoukankan      html  css  js  c++  java
  • 背水一战 Windows 10 (91)

    [源码下载]


    背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体



    作者:webabcd


    介绍
    背水一战 Windows 10 之 文件系统

    • Application Data 中的文件操作
    • Application Data 中的“设置”操作
    • 通过 uri 引用 Application Data 中的媒体



    示例
    1、演示如何在 Application Data(应用程序数据存储)中对文件进行操作
    FileSystem/AppData/FileDemo.xaml

    <Page
        x:Class="Windows10.FileSystem.AppData.FileDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.AppData"
        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="btnReadWrite" Content="读写 Application Data 中的文件" Click="btnReadWrite_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/AppData/FileDemo.xaml.cs

    /*
     * 演示如何在 Application Data(应用程序数据存储)中对文件进行操作
     * 
     * 
     * StorageFile - 文件操作类
     *     public static IAsyncOperation<StorageFile> GetFileFromApplicationUriAsync(Uri uri) - 获取本地指定 uri 的文件
     * 
     * 
     * ApplicationData - 操作 Application Data 中数据的类
     *     Current - 返回当前的 ApplicationData 对象
     *     LocalFolder - 返回 StorageFolder 对象。本地存储,永久保存
     *         保存路径:%USERPROFILE%AppDataLocalPackages{PackageId}LocalState
     *         访问协议:ms-appdata:///local/
     *     RoamingFolder - 返回 StorageFolder 对象。漫游存储,同一微软账户同一应用程序在不同设备间会自动同步
     *         保存路径:%USERPROFILE%AppDataLocalPackages{PackageId}RoamingState
     *         访问协议:ms-appdata:///roaming/
     *     TemporaryFolder - 返回 StorageFolder 对象。临时存储,系统在需要的时候可以将其删除
     *         保存路径:%USERPROFILE%AppDataLocalPackages{PackageId}TempState
     *         访问协议:ms-appdata:///temp/
     *     RoamingStorageQuota - 从漫游存储同步到云端的数据的最大大小,只读
     *     ClearAsync() - 删除 Application Data 中的数据
     *     ClearAsync(ApplicationDataLocality locality) - 删除指定存储区的数据据
     *         ApplicationDataLocality.Local, ApplicationDataLocality.Roaming, ApplicationDataLocality.Temporary
     *    
     *     DataChanged - 从服务端向 app 同步漫游数据时所触发的事件
     *     SignalDataChanged() - 强行触发 DataChanged 事件
     */
    
    using System;
    using Windows.Storage;
    using Windows.UI.Core;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.FileSystem.AppData
    {
        public sealed partial class FileDemo : Page
        {
            StorageFolder _localFolder = ApplicationData.Current.LocalFolder;
    
            public FileDemo()
            {
                this.InitializeComponent();
            }
    
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                ApplicationData.Current.DataChanged += Current_DataChanged;
    
                base.OnNavigatedTo(e);
            }
    
            protected override void OnNavigatedFrom(NavigationEventArgs e)
            {
                ApplicationData.Current.DataChanged -= Current_DataChanged;
    
                base.OnNavigatedFrom(e);
            }
    
            //  从服务端向 app 同步漫游数据时
            private async void Current_DataChanged(ApplicationData sender, object args)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "DataChanged 事件被触发";
                });
            }
    
            private async void btnReadWrite_Click(object sender, RoutedEventArgs e)
            {
                //
                StorageFile fileWrite = await _localFolder.CreateFileAsync(@"webabcdTest
    eadWriteDemo.txt", CreationCollisionOption.ReplaceExisting);
                await FileIO.WriteTextAsync(fileWrite, "I am webabcd: " + DateTime.Now.ToString());
    
                //// StorageFile fileRead = await _localFolder.GetFileAsync(@"webabcdTest
    eadWriteDemo.txt");
                StorageFile fileRead = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/webabcdTest/readWriteDemo.txt", UriKind.Absolute));
                string textContent = await FileIO.ReadTextAsync(fileRead);
                lblMsg.Text = textContent;
    
                // 强行触发 DataChanged 事件(仅为演示用,实际项目中不需要)
                ApplicationData.Current.SignalDataChanged();
            }
        }
    }


    2、演示如何在 Application Data(应用程序数据存储)中对“设置”进行操作
    FileSystem/AppData/SettingsDemo.xaml

    <Page
        x:Class="Windows10.FileSystem.AppData.SettingsDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.AppData"
        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="btnReadWrite" Content="读写 Settings" Click="btnReadWrite_Click" Margin="5" />
    
                <Button Name="btnReadWriteWithContainer" Content="分组 Settings" Click="btnReadWriteWithContainer_Click" Margin="5" />
    
                <Button Name="btnReadWriteWithComposite" Content="父子 Settings" Click="btnReadWriteWithComposite_Click" Margin="5" />
    
                <Button Name="btnSetVersion0" Content="将 Application Data 的版本号设置为 0" Click="btnSetVersion0_Click" Margin="5" />
    
                <Button Name="btnSetVersion1" Content="将 Application Data 的版本号设置为 1" Click="btnSetVersion1_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/AppData/SettingsDemo.xaml.cs

    /*
     * 演示如何在 Application Data(应用程序数据存储)中对“设置”进行操作
     * 
     * ApplicationData - 操作 Application Data 中数据的类
     *     Current - 返回当前的 ApplicationData 对象
     *     LocalSettings - 返回 ApplicationDataContainer 对象。本地存储,永久保存
     *         保存路径:%USERPROFILE%AppDataLocalPackages{PackageId}Settings
     *     RoamingSettings - 返回 ApplicationDataContainer 对象。漫游存储,同一微软账户同一应用程序在不同设备间会自动同步
     *         保存路径:%USERPROFILE%AppDataLocalPackages{PackageId}Settings
     *     Version - 获取当前 Application Data 的版本号,默认值为 0,只读(用于本地“设置”数据的版本控制)
     *     SetVersionAsync() - 指定当前 Application Data 的版本号(用于本地“设置”数据的版本控制)
     * 
     * ApplicationDataContainer - 操作“设置”数据的类
     *     Name - 容器的名称,默认为空
     *     CreateContainer(string name, ApplicationDataCreateDisposition disposition) - 激活一个用于保存“设置”数据的容器,即分组“设置”数据
     *         name - 容器的名称
     *         disposition - 容器的激活方式:Always - 始终激活;Existing - 容器存在才激活
     *     Containers - 容器集合
     *     DeleteContainer() - 删除指定的容器
     *     Values - 保存“设置”数据,一个字典表
     *         其数据可以是一个 ApplicationDataCompositeValue 类型的数据,ApplicationDataCompositeValue 也是一个字典表,这样可将多个“设置”数据放到一个 key 里
     *       
     * 
     * 备注:
     * 当 key 为 HighPriority 时,系统会以最快的速度在多个设备间同步 HighPriority 所对应的数据(支持 ApplicationDataCompositeValue 数据)
     * 示例如下:
     * ApplicationDataContainer.Values["HighPriority"] = "此处的值将会以系统最快的速度在多个设备间同步";
     */
    
    using System;
    using Windows.Storage;
    using Windows.UI.Core;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.FileSystem.AppData
    {
        public sealed partial class SettingsDemo : Page
        {
            public SettingsDemo()
            {
                this.InitializeComponent();
            }
    
            // 操作“设置”数据的 demo
            private void btnReadWrite_Click(object sender, RoutedEventArgs e)
            {
                ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
    
                // 保存“设置”数据
                localSettings.Values["key"] = "I am webabcd";
    
                // 如果 key 为 HighPriority,则系统将会以最高优先级的速度在多个设备间同步 HighPriority 的值
                // localSettings.Values["HighPriority"] = "I am webabcd";
    
                // 删除指定的“设置”数据
                // localSettings.Values.Remove("key");
    
                // 获取“设置”数据
                lblMsg.Text = (string)localSettings.Values["key"];
            }
    
            // 分组“设置”数据,即在不同的容器中保存不同的数据
            private void btnReadWriteWithContainer_Click(object sender, RoutedEventArgs e)
            {
                // 在 LocalSettings 中激活名为 groupName 的容器
                ApplicationDataContainer container = ApplicationData.Current.LocalSettings;
                ApplicationDataContainer localSettings = container.CreateContainer("groupName", ApplicationDataCreateDisposition.Always);
    
                // 删除指定的容器
                // container.DeleteContainer("groupName");
    
                // 在容器内保存“设置”数据
                if (container.Containers.ContainsKey("groupName"))
                {
                    container.Containers["groupName"].Values["key"] = "I am webabcd";
                }
    
                // 从指定的容器内获取“设置”数据
                lblMsg.Text = (string)container.Containers["groupName"].Values["key"];
                lblMsg.Text += Environment.NewLine;
                // 从指定的容器内获取“设置”数据
                lblMsg.Text += (string)localSettings.Values["key"];
            }
    
            // 父子“设置”数据,即 key 中的数据是一个 ApplicationDataCompositeValue 对象,而 ApplicationDataCompositeValue 也是一个字典表
            private void btnReadWriteWithComposite_Click(object sender, RoutedEventArgs e)
            {
                ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
    
                // 父子“设置”数据的保存
                ApplicationDataCompositeValue parent1 = new ApplicationDataCompositeValue();
                parent1["child1"] = "abc";
                parent1["child2"] = "xyz";
                localSettings.Values["parent1"] = parent1;
    
                // 父子“设置”数据的获取
                lblMsg.Text = (string)((ApplicationDataCompositeValue)localSettings.Values["parent1"])["child1"];
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += (string)((ApplicationDataCompositeValue)localSettings.Values["parent1"])["child2"];
            }
    
    
            private async void btnSetVersion0_Click(object sender, RoutedEventArgs e)
            {
                // 将 Application Data 的版本号设置为 0,并执行指定的方法
                await ApplicationData.Current.SetVersionAsync(0, new ApplicationDataSetVersionHandler(SetVersionHandler));
            }
    
            private async void btnSetVersion1_Click(object sender, RoutedEventArgs e)
            {
                // 将 Application Data 的版本号设置为 1,并执行指定的方法
                await ApplicationData.Current.SetVersionAsync(1, new ApplicationDataSetVersionHandler(SetVersionHandler));
            }
    
            // 根据当前版本号和将要设置成的版本号,将“设置”数据升级到最新版本
            private async void SetVersionHandler(SetVersionRequest request)
            {
                // 异步操作
                SetVersionDeferral deferral = request.GetDeferral();
    
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    lblMsg.Text = "CurrentVersion: " + request.CurrentVersion; // 当前版本号
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "DesiredVersion: " + request.DesiredVersion; // 将要设置成的版本号
                    lblMsg.Text += Environment.NewLine;
                    lblMsg.Text += "ApplicationData.Current.Version: " + ApplicationData.Current.Version; // 当前版本号
                });
    
                // 完成异步操作
                deferral.Complete();
            }
        }
    }


    3、演示如何通过 uri 的方式引用 Application Data(应用程序数据存储)中的媒体(图片、视频或音频)文件
    FileSystem/AppData/MediaReference.xaml

    <Page
        x:Class="Windows10.FileSystem.AppData.MediaReference"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.AppData"
        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">
    
                <Image Name="imgAppdata" Stretch="None" HorizontalAlignment="Left" Margin="5" />
                <Image Name="imgAppx" Stretch="None" HorizontalAlignment="Left" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/AppData/MediaReference.xaml.cs

    /*
     * 演示如何通过 uri 的方式引用 Application Data(应用程序数据存储)中的媒体(图片、视频或音频)文件
     * 
     * ApplicationData 中的 LocalFolder 对应 ms-appdata:///local/
     * ApplicationData 中的 RoamingFolder 对应 ms-appdata:///roaming/
     * ApplicationData 中的 TemporaryFolder 对应 ms-appdata:///temp/
     * 
     * StorageFile - 文件操作类
     *     public static IAsyncOperation<StorageFile> GetFileFromApplicationUriAsync(Uri uri) - 获取本地指定 uri 的文件
     */
    
    using System;
    using Windows.Storage;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.FileSystem.AppData
    {
        public sealed partial class MediaReference : Page
        {
            public MediaReference()
            {
                this.InitializeComponent();
            }
    
            protected async override void OnNavigatedTo(NavigationEventArgs e)
            {
                ApplicationData appData = ApplicationData.Current;
    
                try
                {
                    // 将程序包内的文件保存到 ApplicationData 中的 TemporaryFolder
                    StorageFile imgFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Logo.png"));
                    await imgFile.CopyAsync(appData.TemporaryFolder, imgFile.Name, NameCollisionOption.ReplaceExisting);
                }
                catch { }
    
                // 引用 Application Data 内的图片文件并显示
                imgAppdata.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appdata:///temp/Logo.png"));
                // 引用程序包内的图片文件并显示
                imgAppx.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appx:///Assets/Logo.png"));
    
                // 也可以在 xaml 这样写
                // <img src="ms-appdata:///temp/Logo.png" />
    
                base.OnNavigatedTo(e);
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/webabcd/p/9181399.html
Copyright © 2011-2022 走看看