Xamarin逆引きTips

Xamarin逆引きTips

Plugins for Xamarinを使いこなすには?(ファイルシステム編)

2016年1月27日

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。

田淵 義人(@ytabuchi
  • このエントリーをはてなブックマークに追加

 皆さんは、Xamarin.Formsでデバイス固有の機能を簡単に利用できるライブラリ群がプラグインとして提供されているのをご存じだろうか? 「Plugins for Xamarin」と呼ばれるそれらのプラグインは、最初に2014年末に開催されたXamarin Plugin Contestで募集されたことにより数が増え、そのときの成果物を含めて現在では多数のプラグインがGitHub上で公開されている。

 今回から複数回にわたり、Plugins for Xamarinの中からいくつかのプラグインを紹介していこうと思う。これらのプラグインは全てPCL(ポータブル・クラス・ライブラリ)で用意されている。PCLについては「インサイドXamarin: 第13回 Xamarinと、ポータブル・クラス・ライブラリ(PCL)」を参照してほしい。

PCLStorageの経緯

 初回である今回は、簡単にファイルの入出力ができる、PCL Storage(GitHub)を紹介する*1

  • *1 本稿のサンプルは、Windows 10 Pro上のVisual Studio 2015 Update 1を使用している。

 作者によると、このライブラリを作成した背景は、アプリケーションのローカルストレージ領域にアクセスするAPIが.NETプラットフォーム間で異なることにあるようだ。具体的には、フルの.NETではSystem.IO名前空間のAPI、SilverlightやWindows PhoneではSystem.IO.IsolatedStorage名前空間のAPI、WinRTではWindows.Storage名前空間のAPIというように、プラットフォームごとに異なるAPIを利用しなければならず、コードを共通化できないという課題がある。

 また、「TIPS:Xamarin.iOS/Androidでアプリの設定情報を保存するには?」でも紹介されているように、iOS/Android向けのXamarin開発では.NET APIのIsolatedStorageが使用できるものの、PCLに含めることはできない。PCLでストレージにアクセスするために各OSネイティブAPIのNSUserDefaultsSharedPreferenceを使用する場合には、「TIPS:Xamarin.Formsからプラットフォーム固有の機能を利用するには?(DependencyService利用)」で説明されているように、DependencyServiceを使用する必要があり、手間がかかる(参考: DependencyServiceを使用してストレージへのアクセスを共通化する方法は「Xamarinの開発者向けドキュメント(英語)」を参照してほしい)。

 PCLStorageは、そういった「プラットフォーム間のAPIの違い」という課題を乗り越え、「PCLでDependencyServiceを使用する」という手間を解消してくれる。

PCLStorageのインストール

 まずは、各プロジェクトにPCLStorageをインストールしよう。これはNuGetを使って簡単にできる。

 Visual StudioでXamarin.Formsのプロジェクトを開き、一番上のソリューションアイコンを右クリックして(表示されたコンテキストメニューの)[ソリューションの NuGet パッケージの管理]をクリックする(図1)。

図1 ソリューション項目の右クリックメニューから[ソリューションの NuGet パッケージの管理]をクリック
図1 ソリューション項目の右クリックメニューから[ソリューションの NuGet パッケージの管理]をクリック

 [参照]タブで「PCLStorage」を検索し、PCLStorageを全てのプロジェクトに[インストール]する(図2)。

図2 [参照]タブで「PCLStorage」を検索

 図3のような確認ダイアログが表示されるので[OK]ボタンをクリックすると、各プロジェクトにライブラリがインストールされる。

図3 PCLStorageがインストールされるプロジェクトの一覧
図3 PCLStorageがインストールされるプロジェクトの一覧

 以上でインストールは完了だ。

 次に、PCLStorageを使ったファイルの保存と読み込み方法を説明しよう。

ファイルの保存

 次のコードでファイルの保存ができる(使われている各クラス/インターフェースはPCLStorage名前空間に所属する)。

C#
using PCLStorage;

IFolder rootFolder = FileSystem.Current.LocalStorage; //<- 1
IFile file = await rootFolder.CreateFileAsync("data.txt", CreationCollisionOption.ReplaceExisting); // <- 2
await file.WriteAllTextAsync("保存するテキスト");
ファイルの作成と書き込み

 コードは難しくないので詳細な説明は割愛し、注意してほしいポイントだけ説明しておこう。

 1FileSystem.Current.LocalStorageプロパティでローカルストレージとなるフォルダー(=IFolderオブジェクト)を取得する。なおWinRTではFileSystem.Current.RoamingStorageプロパティ(=ローミングデータ用のストレージ)も利用できる。

 2IFolderオブジェクトのCreateFileAsync(string desiredName, CreationCollisionOption option)メソッド(戻り値はTask<IFile>型)でファイルを作成する。作成時にファイル名が衝突した際の挙動を決めるオプションであるCreationCollisionOption列挙体には、

  • GenerateUniqueName 「name (2).txt」という形式でユニークな名前を付けてファイルを作成する
  • ReplaceExisting 新規の空のファイルで、既存のファイルを置き換える
  • FailIfExists 既存のファイルが存在する場合は例外を投げる
  • OpenIfExists 既存のファイルが何であれ、それを開く

という値が用意されている。

ファイルの読み込み

 次のコードでファイルの読み込みができる。

C#
using PCLStorage;

IFolder rootFolder = FileSystem.Current.LocalStorage;
IFile file = await rootFolder.GetFileAsync("data.txt");
string saveddata = await file.ReadAllTextAsync();
ファイルの読み込み

 こちらも注意してほしいポイントだけ説明する。

 IFolderオブジェクトのGetFileAsyncメソッドを呼び出したとき、対象のファイルが存在しない場合は例外が発生する。これを回避するために、

 ExistenceCheckResult res = await rootFolder.CheckExistsAsync("data.txt");

というコードで事前にファイルの有無をチェックをしておくとよいだろう。戻り値の型となっているExistenceCheckResult列挙体には、

  • NotFound 指定された名前/パスのファイルが存在しない
  • FileExists 指定された名前/パスのファイルが存在する
  • FolderExists 指定された名前/パスのフォルダーが存在する

という値が用意されている。

まとめ

 PCLStorageを使用することで、iOS/Android/UWP/Windows Phoneなどでファイルの保存、読み込み、削除、更新、リネーム、移動などがPCLの単一コードで簡単に行えるようになる。保存・読み込み以外のAPIについてはGitHubのReadme(英語)を参照してほしい。

 参考までに、iOS/Android/UWP/Windows PhoneアプリとPCLで構成されるサンプルコードを、下記のリンク先にアップしているので、ぜひ参照してほしい。

 以下に各プラットフォームでの実行例の画面を示しておく。

iOSアプリ
iOSアプリ
Androidアプリ
Androidアプリ
UWPアプリ
Windows Phone 8.1アプリ
Windows Phone 8.1アプリ

※以下では、本稿の前後を合わせて5回分(第61回~第65回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

61. Xamarin Android Playerを使うには?

Xamarin製の高性能Android EmulatorであるXamarin Android Playerの使い方を紹介する。

62. Plugins for Xamarinを使いこなすには?(GPS編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。

63. 【現在、表示中】≫ Plugins for Xamarinを使いこなすには?(ファイルシステム編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。

64. Plugins for Xamarinを使いこなすには?(Device Motion ― 加速度センサー/ジャイロスコープセンサー編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーの機能を使う方法を説明する。

65. Plugins for Xamarinを使いこなすには?(Device Motion ― 磁気センサー/コンパス編)

デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Magnetometer(磁気)センサー、Compass(コンパス)の機能を使う方法を説明する。

イベント情報(メディアスポンサーです)

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社