Windows10のUWPアプリでテキストファイルを書き込む方法

業務アプリなどで結果の出力としてドキュメントやログなど任意のファイルを出力するケースがあると思います。
Windows8向けのUWP(Universal Windows Platform)の場合は、マニフェストの設定画面(Package.appxmanifestファイル)で「ドキュメント ライブラリ」への権限の設定があったのですが、Windows10向けのUWPアプリではドキュメントへの書き込み権限の設定がなくなっています。
(実際にはWindows8.1以降で設定画面から削除されていた。)

セキュリティの関係だと思われますが、
・音楽ライブラリ(MyMusic)
・画像ライブラリ(MyPicture)
・ビデオ ライブラリ(MyVideos)
などは残っているのに、「ドキュメント ライブラリ」が消えてしまっています。
他のファイル形式は完全に扱えなくなったのでしょうか?

実は次の方法で対応を行うことにより、書き込みが可能となります。

対応方法

「Package.appxmanifest」ファイルを手動で編集することで、対応が可能になっています。
右クリックで、コードを表示させると、Capabilitiesタグが見つかります。

  <Capabilities>
    <Capability Name="internetClient" />
    <uap:Capability Name="documentsLibrary" />
    <DeviceCapability Name="bluetooth" />
  </Capabilities>

そこの中に、手動で「<uap:Capability Name=”documentsLibrary” />」と追加することで、Windows10であってもマイドキュメント内部にアクセスが可能になります。
(※Windows 8では「<Capability Name=”documentsLibrary” />」の形式でしたが、uap:Capabilityタグに変更となっています。)

さらにファイルの拡張子もここに登録する必要があります。

      <Extensions>
        <uap:Extension Category="windows.fileTypeAssociation">
          <uap:FileTypeAssociation Name="log">
            <uap:EditFlags AlwaysUnsafe="true" />
            <uap:SupportedFileTypes>
              <uap:FileType>.txt</uap:FileType>
            </uap:SupportedFileTypes>
          </uap:FileTypeAssociation>
        </uap:Extension>
     <Extensions>

このように「<uap:FileType>」を登録することで、拡張子「.txt」のファイルが扱えるようになります。
※この設定はマニフェストの設定画面でも行えます。自信のない方は設定画面で登録してください。

あとはこのようなコードで、「KnownFolders.DocumentsLibrary」から、実際のファイルパスを取得して、ログを書き出すだけです。
※うまくマニフェストの記述がされていないと、権限エラーとなります。

        private string logBuffer;
        private async void log_Save()
        {
            StorageFolder folder = KnownFolders.DocumentsLibrary;
            StorageFile outfile = await folder.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") + "_log.txt", CreationCollisionOption.GenerateUniqueName);

            Debug.WriteLine("[Info]: Saved " + outfile.Path);
            var out_stream = await outfile.OpenAsync(FileAccessMode.ReadWrite);

            DataWriter dataWriter = new DataWriter(out_stream.GetOutputStreamAt(0));

            dataWriter.WriteString(logBuffer);

            await dataWriter.StoreAsync();
            await dataWriter.FlushAsync();

            dataWriter.DetachStream();
        }

UWPアプリでサンドボックス化もそれなりにメリットがあっていいのですが、今まで普通にできていたことが制限されてしまうとなかなかつらいですね。

参考

アプリ機能の宣言 – MSDN
MetroStyleApp入門 vol3.ファイルの保存

Search index:
[Universal Windows Platform App] Document Library Capability in Windows 10
[UWP App] App manifest declares document library access capability without specifying at least one file type association.

この記事をシェアする
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook
0

Comments

Comments