默认情况下,通用 Windows 平台 (UWP) 应用可以访问特定文件系统位置。 应用也可以通过文件选取器或通过声明功能访问其他位置。
在创建新的应用时,默认情况下你可以访问以下文件系统位置:
1. 应用程序安装目录
Windows.Storage.StorageFolder installedLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;
或者直接指定需要的文件
using Windows.Storage; StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///file.txt"));
2. 应用程序数据位置
使用 ApplicationData 属性检索应用数据文件夹。
using Windows.Storage; StorageFolder localFolder = ApplicationData.Current.LocalFolder;
如果希望访问应用的漫游或临时文件夹,可以改用 RoamingFolder 或 TemporaryFolder 属性。
3. 用户的“下载”文件夹
你可以在用户的下载文件夹中创建文件
using Windows.Storage; StorageFile newFile = await DownloadsFolder.CreateFileAsync("file.txt");
你可以在用户的“下载”文件夹中创建子文件夹
using Windows.Storage; StorageFolder newFolder = await DownloadsFolder.CreateFolderAsync("New Folder");
4. 其它文件夹
文档 | DocumentsLibrary 注意:必须将文件类型关联(该关联声明应用可以在此位置中访问的特定文件类型)添加到应用清单。 你的应用使用此功能的情况: - 使用有效的 OneDrive URL 或资源 ID 促进跨平台离线访问特定 OneDrive 内容 - 在离线时将打开的文件自动保存到用户的 OneDrive |
KnownFolders.DocumentsLibrary |
音乐 | MusicLibrary 另请参阅音乐、图片和视频库中的文件和文件夹。 |
KnownFolders.MusicLibrary |
图片 | PicturesLibrary 另请参阅音乐、图片和视频库中的文件和文件夹。 |
KnownFolders.PicturesLibrary |
视频 | VideosLibrary 另请参阅音乐、图片和视频库中的文件和文件夹。 |
KnownFolders.VideosLibrary |
可移动设备 | RemovableDevices 必须将文件类型关联(该关联声明应用可以在此位置中访问的特定文件类型)添加到应用清单。 另请参阅访问 SD 卡。 |
KnownFolders.Re |
5. 更强大文件获取能力
5. 更强大文件获取能力
5. 更强大文件获取能力
这功能几乎颠覆了UWP之前的历史,可以获取除了C盘以外所有的文件。
但是,这个权限需要跟用户申请,用户手动确认了,你才可以。
在执行你的超能力之前,你需要引导用户,给你的App权限:隐私——文件系统。
使用代码直达:
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:ms-settings:privacy-broadfilesystemaccess"));
这样就打开了这么一个界面。
然后就是配置一下你的Package.appxmanifest文件。用文本查看器打开
添加下面的代码
应该你的文件里面存在了IgnorableNamespace,你只需要把rescap加进去即可。
<Package ... xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp uap5 rescap"> ... <Capabilities> <rescap:Capability Name="broadFileSystemAccess" /> </Capabilities>
然后开始写代码测试:
string dir = "D:\"; string fileName = "sample.txt"; private async void Read_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) { StorageFile file = await StorageFile.GetFileFromPathAsync(Path.Combine(dir, fileName)); TextBox_Content.Text = await FileIO.ReadTextAsync(file); } private async void Write_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) { StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(dir); StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists); await FileIO.WriteTextAsync(file, TextBox_Content.Text); }