SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

UWPアプリでファイルマネージャーを作ろう!
~ついにWindows 10 1803で実現

UWPアプリ開発の最前線 第8回

ファイルの「フルアクセス」機能を使う

要約

  • この機能は、broadFileSystemAccessケイパビリティを有効にすることで、利用可能になります
  • このケイパビリティがあると、任意の絶対パス文字列からIStorageItemオブジェクトを取得できます
  • 「フルアクセス」とカッコ書きにしているのは、システム属性/隠し属性が付いているフォルダー/ファイルにはアクセスできないからです
  • broadFileSystemAccessケイパビリティは、開発者がアプリマニフェストで許可していても、ユーザーが設定で拒否できるようになっています
  • このケイパビリティを使ったアプリをMicrosoftストアに申請するには、それが必要であることをストア側に説明して納得してもらう必要があります

broadFileSystemAccessケイパビリティ

 Windows 10 1803(build 17134)以上を最小バージョンにしてUWPアプリのプロジェクトを作り、アプリマニフェストにbroadFileSystemAccessケイパビリティを追加します。ただし、特殊なケイパビリティなので、マニフェストエディターの[機能]タブには表示されません。

 ソリューションエクスプローラーで「Package.appxmanifest」ファイルを右クリックし、コンテキストメニューから[コードの表示]を選ぶと、XMLエディターでマニフェストファイルが開かれます。そこで次のコードに示すように、マニフェストを書き換えます。ここでrescapは"restricted capability"(制限されているケイパビリティ)の意味です。また、rescap:Capability要素を記述すると警告が出るかもしれませんが、無視してください。

アプリマニフェストを手動で修正する(冒頭部分)
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  IgnorableNamespaces="uap mp">
        


<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">
アプリマニフェストを手動で修正する(末尾部分)
  <Capabilities>
    <Capability Name="internetClient" />
  </Capabilities>
</Package>



  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="broadFileSystemAccess" />
  </Capabilities>
</Package>

 なお、broadFileSystemAccessケイパビリティを付与したUWPアプリは、WACK(Windows App Cert. Kit)のテストにパスしなくなります。

任意のパス文字列からIStorageItemオブジェクトを取得する

 といっても、新しいAPIを使うわけではありません。Windows 8の「ストアアプリ」からあるStorageFolder.GetFolderFromPathAsyncメソッドStorageFile.GetFileFromPathAsyncメソッドを使います。

 これら2つのメソッドは、引数にフルパスを要求します。しかし、これまでは、アプリに許可されたフォルダーでしか有効ではありませんでした。アプリに許可されたフォルダーならば、取得が困難なフルパス文字列を使うより、アプリからの相対URIや決められたURIを使うStorageFile.GetFileFromApplicationUriAsyncメソッドなどの方がよっぽど楽ですから、これら2つのメソッドを使う機会はめったになかったのです。

 それがbroadFileSystemAccessケイパビリティを付与すると、任意のフルパスを指定できるようになります。試しに、MainPageクラスに次のようなコードを追加して実行してみてください。ソースコード冒頭にusing Windows.Storage;の追加が必要です。

フォルダー/ファイルへの「フルアクセス」を試す
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
  base.OnNavigatedTo(e);

  // GetFolderFromPathAsync() の動作確認
  IStorageItem winFolder
    = await StorageFolder.GetFolderFromPathAsync(@"c:\windows");
  await (new Windows.UI.Popups.MessageDialog(winFolder.Path)).ShowAsync();

  // GetFileFromPathAsync() の動作確認
  IStorageItem notepadFile
    = await StorageFile.GetFileFromPathAsync(@"c:\windows\NotePad.exe");
  await (new Windows.UI.Popups.MessageDialog(notepadFile.Path)).ShowAsync();
}
取得したファイルオブジェクトを表示しているダイアログ
絶対パス指定で「メモ帳」ファイルのIStorageItemオブジェクトが取得できた

 上のコードでパスを変えていろいろ試してみてください。ルートフォルダー(「C:\」など)も取得できます。しかし、隠し属性などが付いていると、アクセス拒否されます。ユーザーが普通にアクセスできる場所に限定されているようです(「エクスプローラーで隠しファイル/システムファイルを表示する設定に変えておくのが『普通』だろ」というのは、今はなしで)。

 さて、ファイルマネージャーを作るには、ルートフォルダーのStorageFolderオブジェクトさえ取得できればよいです。あとは、StorageFolder.GetItemsAsyncメソッドなどで配下のフォルダー/ファイルを探索していけばよいのですから。ルートフォルダのフルパスは、ドライブ名さえ分かれば簡単に生成できます。

ドライブレターを取得する

 すべてのドライブ名を取得するには、System.IO名前空間のDirectory.GetLogicalDrivesメソッドを使います。

 このメソッドは.NET Frameworkの初期からあるものですが、UWPで使えるようになったのは.NET Core 2.0から、すなわちWindows 10 1709(build 16299)からです。これには、broadFileSystemAccessケイパビリティは必要ありません。.NET CoreとUWPのバージョンの関係については、連載第3回「UWPアプリからSQL Serverにアクセス ~.NET Standard 2.0の威力! WPFやXamarinからも共通に使えるクラスライブラリを作る」2ページ目の下方にある表をご覧ください。

ユーザー設定

 このbroadFileSystemAccessケイパビリティは、ユーザーが拒否できます。Windows 10 1803(build 17134)では、次の画像のように設定アプリで行います。すべてのアプリをまとめてオン/オフすることも(中央付近のスイッチ)、アプリごとに個別にオン/オフすることもできます(右下のスイッチ)。

設定アプリの[プライバシー]-[ファイル システム]
設定アプリでファイルシステムへの「フルアクセス」許可を変更する

 設定でオフにされると、アプリマニフェストにbroadFileSystemAccessケイパビリティが書かれていないときと同様に、UnauthorizedAccessException例外「アクセスが拒否されました」が発生します。「ケイパビリティを与えたら必ずアクセスできる」とは思わないでください。例外をキャッチして適切な対処をしてください。サンプルコードでは、アプリ起動時にオフにされていたら設定アプリの上記の画面を呼び出すようにしています。

配布方法

サイドローディング

 サイドローディングでの配布は、従来通りです。組織内での業務アプリなどは、broadFileSystemAccessケイパビリティ付きであってもサイドローディングすれば問題ありません。

 業務アプリをサイドローディングで配布する方法は、「Windows 10 での LOB アプリのサイドローディング」や「Enterprise app management」(本稿執筆時点では英語のみ)などをご覧ください。なお、Windows 10 1607からは、(正式なデジタル署名がされた)アプリパッケージをダブルクリックするだけで次の画像のようなインストーラーが立ち上がってインストールできるようになっています。

UWPアプリのインストーラー
アプリパッケージをダブルクリックしてサイドローディングする

Microsoftストアへの申請

 broadFileSystemAccessケイパビリティは「制限付き機能」(restricted capability)です。普通のUWPアプリのつもりでストアに申請するとリジェクトされてしまいます。詳細は「アプリ機能の宣言」の「制限付き機能」セクションをご覧いただきたいのですが、このケイパビリティの必要性をストアのテスターに納得してもらわねばなりません。

 その手順は変更されることがあります。本稿執筆時点では、申請するときに「申請オプション」のページの「認定の注意書き」セクション(次の画像)に説明を記述します。なぜ必要なのか、それによってユーザーにどんなメリットがあるのかといったことを説明して、テスターに「なるほど、これはストアで公開する価値がある」と思ってもらえれば認定されるでしょう。日本語を理解できないテスターが担当することもあるので、英語で記述したほうが無難です。

「申請オプション」のページの「認定の注意書き」セクション
申請するとき「認定の注意書き」セクションにケイパビリティの必要性を記述する

次のページ
ルートフォルダーを取得してTreeViewコントロールに表示する

関連リンク

この記事は参考になりましたか?

UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11072 2018/09/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー