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

    [源码下载]


    背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理



    作者:webabcd


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

    • 获取 Package 中的文件
    • 可移动存储中的文件操作
    • “库”管理



    示例
    1、演示如何获取 Package 中的文件
    FileSystem/PackageData/Demo.xaml

    <Page
        x:Class="Windows10.FileSystem.PackageData.Demo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.PackageData"
        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="btnRead" Content="读取 Package 中的文件" Click="btnRead_Click" Margin="5" />
    
                <Image Name="img" Stretch="None" HorizontalAlignment="Left" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/PackageData/Demo.xaml.cs

    /*
     * 演示如何获取 Package 中的文件
     * 1、可以通过 Package.Current.InstalledLocation.GetFileAsync() 访问
     * 2、可以通过 ms-appx:/// 访问
     * 
     * 
     * StorageFile - 文件操作类
     *     public static IAsyncOperation<StorageFile> GetFileFromApplicationUriAsync(Uri uri) - 获取本地指定 uri 的文件
     *     
     *     
     * 注:需要访问的 Package 中的文件的属性的“生成操作”应该设置为“内容”
     */
    
    using System;
    using Windows.Storage;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.FileSystem.PackageData
    {
        public sealed partial class Demo : Page
        {
            public Demo()
            {
                this.InitializeComponent();
            }
    
            private async void btnRead_Click(object sender, RoutedEventArgs e)
            {
                // 写(无法向程序包中写数据,会报错)
                // StorageFile fileWrite = await Package.Current.InstalledLocation.CreateFileAsync(@"FileSystemPackageData
    eadWriteDemo.txt", CreationCollisionOption.ReplaceExisting);
                // await FileIO.WriteTextAsync(fileWrite, "I am webabcd: " + DateTime.Now.ToString());
    
                //// StorageFile fileRead = await Package.Current.InstalledLocation.GetFileAsync(@"FileSystemPackageData
    eadWriteDemo.txt");
                StorageFile fileRead = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///FileSystem/PackageData/readWriteDemo.txt", UriKind.Absolute));
                string textContent = await FileIO.ReadTextAsync(fileRead);
                lblMsg.Text = textContent;
    
    
                // 引用程序包内的图片文件并显示
                img.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appx:///Assets/hololens.jpg"));
            }
        }
    }


    2、演示如何在可移动存储中对文件进行操作
    FileSystem/RemovableDevice/Demo.xaml

    <Page
        x:Class="Windows10.FileSystem.RemovableDevice.Demo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.RemovableDevice"
        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" />
    
                <ListBox Name="listBox" Width="400" Height="200" HorizontalAlignment="Left" Margin="5" SelectionChanged="listBox_SelectionChanged" />
    
                <Button Name="btnCopyFile" Content="复制文件到当前选中的设备中" Margin="5" Click="btnCopyFile_Click" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/RemovableDevice/Demo.xaml.cs

    /*
     * 演示如何在可移动存储中对文件进行操作
     */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Windows.Storage;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.FileSystem.RemovableDevice
    {
        public sealed partial class Demo : Page
        {
            public Demo()
            {
                this.InitializeComponent();
            }
    
            protected async override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 获取全部可移动存储
                StorageFolder removableDevices = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.RemovableDevices);
                IReadOnlyList<StorageFolder> folderList = await removableDevices.GetFoldersAsync();
                listBox.ItemsSource = folderList.Select(p => p.Name).ToList();
    
                base.OnNavigatedTo(e);
            }
    
            private async void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                // 用户选中的可移动存储
                string folderName = (string)listBox.SelectedItem;
                StorageFolder removableDevices = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.RemovableDevices);
                StorageFolder storageFolder = await removableDevices.GetFolderAsync(folderName);
    
                // 用户选中的可移动存储中的根目录下的文件和文件夹总数
                IReadOnlyList<IStorageItem> storageItems = await storageFolder.GetItemsAsync();
                lblMsg.Text = "items count: " + storageItems.Count;
            }
            
            private async void btnCopyFile_Click(object sender, RoutedEventArgs e)
            {
                // 用户选中的可移动存储
                string folderName = (string)listBox.SelectedItem;
    
                if (folderName != null)
                {
                    StorageFolder removableDevices = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.RemovableDevices);
                    StorageFolder storageFolder = await removableDevices.GetFolderAsync(folderName);
    
                    // 复制包内文件到指定的可移动存储
                    StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/hololens.jpg"));
                    try
                    {
                        await storageFile.CopyAsync(storageFolder, "hololens.jpg", NameCollisionOption.ReplaceExisting);
                        lblMsg.Text = "复制成功";
                    }
                    catch (Exception ex)
                    {
                        lblMsg.Text = ex.ToString();
                    }
                }
            }
        }
    }


    3、演示如何 添加/删除 “库”所包含的文件夹
    FileSystem/StorageLibrary/StorageLibraryDemo.xaml

    <Page
        x:Class="Windows10.FileSystem.StorageLibrary.StorageLibraryDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.FileSystem.StorageLibrary"
        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="btnAddFolder" Content="增加一个文件夹引用到图片库" Click="btnAddFolder_Click" Margin="5" />
    
                <Button Name="btnRemoveFolder" Content="从图片库移除之前添加的全部文件夹引用" Click="btnRemoveFolder_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>

    FileSystem/StorageLibrary/StorageLibraryDemo.xaml.cs

    /*
     * 演示如何 添加/删除 “库”所包含的文件夹
     * 
     * StorageLibrary - 用于“库”管理
     *     GetLibraryForUserAsync(User user, KnownLibraryId libraryId) - 获取指定用户的指定“库”,返回 StorageLibrary 类型的对象
     *         user - 指定用户,传 null 则为当前用户(关于 User 相关请参见 /UserAndAccount/UserInfo.xaml)
     *         libraryId - 指定库目录,一个 KnownLibraryId 类型的枚举值(Music, Pictures, Videos, Documents)
     *     Folders - 当前库所包含的文件夹们
     *     SaveFolder - 当前库的默认文件夹
     *     RequestAddFolderAsync() - 添加文件夹到当前库
     *     RequestRemoveFolderAsync() - 从当前库移除指定的文件夹
     *     DefinitionChanged -  当前库所包含的文件夹发生变化时触发的事件
     *     
     *     
     * 注:根据需要请在 Package.appxmanifest 中配置  <Capability Name="picturesLibrary" />, <Capability Name="videosLibrary" />,  <Capability Name="musicLibrary" />, <Capability Name="documentsLibrary" />
     */
    
    using System;
    using System.Collections.Generic;
    using Windows.Storage;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Navigation;
    
    namespace Windows10.FileSystem.StorageLibrary
    {
        public sealed partial class StorageLibraryDemo : Page
        {
            // 临时保存添加进图片库的文件夹
            private List<StorageFolder> _addedFloders = new List<StorageFolder>();
    
            public StorageLibraryDemo()
            {
                this.InitializeComponent();
            }
    
            protected async override void OnNavigatedTo(NavigationEventArgs e)
            {
                // 注意:要想访问图片库,别忘了增加 <Capability Name="picturesLibrary" />
    
                // 获取图片库的 StorageLibrary 对象
                Windows.Storage.StorageLibrary picturesLibrary = await Windows.Storage.StorageLibrary.GetLibraryForUserAsync(null, KnownLibraryId.Pictures);
    
                // 当前库所包含的文件夹增多或减少时
                picturesLibrary.DefinitionChanged += async (Windows.Storage.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;
                        }
                    });
                };
    
                base.OnNavigatedTo(e);
            }
    
            // 增加一个文件夹引用到图片库
            private async void btnAddFolder_Click(object sender, RoutedEventArgs e)
            {
                Windows.Storage.StorageLibrary picturesLibrary = await Windows.Storage.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)
            {
                Windows.Storage.StorageLibrary picturesLibrary = await Windows.Storage.StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
    
                foreach (StorageFolder folder in _addedFloders)
                {
                    // 从图片库移除指定的文件夹引用
                    if (await picturesLibrary.RequestRemoveFolderAsync(folder))
                    {
                        // 移除成功
                    }
                    else
                    {
    
                    }
                }
            }
        }
    }



    OK
    [源码下载]

  • 相关阅读:
    Date
    Math
    封装实参的对象 arguments
    函数方法call()和apply()
    执行上下文栈
    原型(prototype属性)和原型链。 重要!!!
    android studio for Mac快捷键大全
    软件的横竖屏切换
    Android XML文件中@id和@+id的区别
    java中的Iterator<E>
  • 原文地址:https://www.cnblogs.com/webabcd/p/9181375.html
Copyright © 2011-2022 走看看