背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理
背水一战 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(@"FileSystem\PackageData\readWriteDemo.txt", CreationCollisionOption.ReplaceExisting); // await FileIO.WriteTextAsync(fileWrite, "I am webabcd: " + DateTime.Now.ToString()); // 读 // StorageFile fileRead = await Package.Current.InstalledLocation.GetFileAsync(@"FileSystem\PackageData\readWriteDemo.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
[源码下载]