以前Windowsストア向けアプリを作成していた際, プロジェクト内に追加していたファイルへのアクセス方法で詰まったので, 今回は, ストアアプリでプロジェクト内のリソースにアクセスするTipsを紹介します.
さっそく実践
ストアアプリでファイルにアクセスする場合, ある程度決められた場所にファイルがないとアクセス制限に引っかかります. 具体的には,
- ミュージック
- ビデオ
- ピクチャ
- ドキュメント
- アプリのインストールフォルダ
です.
それぞれアクセスするためのオブジェクトを取得してアクセスを行います. 今回は, プロジェクト内にresourceというフォルダを作成し, その中のファイルにアクセスするとします. [csharp] var installedFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; [/csharp]
で, アプリのインストールフォルダのルートフォルダが取得できます.
[csharp] var resourceFolder = await installedFolder.GetFolderAsync("resource"); [/csharp]
このGetFolderAsyncに渡した引数の名前のフォルダのオブジェクトが取得できます. この後, [csharp] var _File = await resourceFolder.GetFileAsync("hoge.txt"); [/csharp]
のようにすると, GetFileAsyncの引数に渡されたファイル名のファイルのオブジェクトが手に入る...はずです.
実際, ここまでは非常に簡単なのですが, ここでなぜか自分の環境では, アクセスできないといった問題にぶつかりました. なぜなのか...?
解決策
この問題を解決するためにしなければならないことは, プロジェクトに追加しているファイルのプロパティの変更です. ファイルのプロパティを開くと, ビルドアクションや出力ディレクトリにコピーなどの設定項目が存在します. 今回は, この中でもビルドアクションを変更します. 恐らくデフォルトの状態では, ”なし” となっているかと思われます. そこで, この項目を ”コンテンツ” に変更します. この項目をコンテンツに変更することにより, プロジェクト内のこのファイルは, アプリで扱えるコンテンツという扱いに変更されるため, アクセスできるようになります.
ここまで終わればあとは,
[csharp] using (Stream stream = (await _File.OpenReadAsync()).AsStream()) { using (TextReader reader = new StreamReader(stream)) { string line = null; while *1 != null) { } } } [/csharp]
のようにStreamを経由して読み出します.
[csharp] ReadLineAsync(); [/csharp]
は, ファイルの中身を一行ずつ読み出す処理を行います.
[csharp] ReadToEndAsync() [/csharp]
は, ファイルの中身を一括で読み込む処理を行います.
これで, ファイルへのアクセスに関する問題を解決できました.
*1:line = await reader.ReadLineAsync(