UWPアプリからすべてのファイルにアクセスする方法
How to access all files from UWP apps
従来のWindows 10におけるUWPアプリでは外部ストレージなどのフォルダーに強い制限がかかっており、ローカルフォルダーを除き、マニフェストで関連付けられた拡張子以外は一切参照できませんでした。ところが2018年4月より配信されたWindows 10 Spring 2018 Update(1803)では、ユーザーが許可していれば、すべてのファイルにアクセスできるようになっています。
UWPでフルファイルアクセスを実現には、appxmanifestで「rescap」名前属性を定義した上で「broadFileSystemAccess」を宣言するだけです。
manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="//schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="//schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="//schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="//schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp rescap">
<Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
</Package>
これで、ウィンドウズの設定ウィンドウの「設定→プライバシー→ファイルシステム」にアプリが追加され、ユーザーに許可を求めることができるようになります。
ただし、注意することがあります。従来の外部フォルダーにアクセスする「Windows.Storage.StorageFolder.KnownFolders」でアクセスできるのは旧来のファイルシステムであるため、たとえマニフェストでライブラリーアクセスを定義済みでも、ここからはすべてのファイルを取得することはできません。
ライブラリーにアクセスしたい場合は「StorageFolder.path」で実体のあるパスを取得して「StorageFoloder.GetFolderFromPathAsync」でフォルダーオブジェクトを得るようにしましょう。
exec.cs
async void Exec()
{
var pf = await KnownFolders.PicturesLibrary.GetFoldersAsync();
var f = await StorageFolder.GetFolderFromPathAsync(pf[0].Path);
var fs = await f.GetFilesAsync();
foreach(var ff in fs) {
// 何らかの処理
}
}
また、マイクロソフトのドキュメントによると、これを定義したアプリは審査に時間がかかるので、余裕を持って申請しましょうとのことです。
2018/05/09