tafuji's blog

C#, Xamarin, Azure DevOps を中心に書いています。

Xamarin.Essentials 入門 - #3 ファイルシステムヘルパー

はじめに

Xamarin.Essentials のファイルシステムヘルパーについて記載します。この API を利用することで、アプリケーション固有のディレクトリの取得、アプリケーションにバンドルだれたファイルを開くことができます。

使ってみよう

使い方

Xamarin.Essentials のファイルシステムヘルパーの機能は、FileSystem クラスで提供されており、以下のことができます。

  • キャッシュデータを格納するアプリケーションのディレクトリの取得
  • アプリケーションのデータディレクトリの取得
  • アプリケーションにバンドルされたファイルを開く

アプリケーション固有のディレクトリは、以下のコードのように FileSystem クラスのプロパティから取得することができます。

// キャッシュディレクトリの取得
var cacheDir = FileSystem.CacheDirectory;


// アプリのデータディレクトリの取得
var mainDir = FileSystem.AppDataDirectory;

各プラットフォームで返されるディレクトリは、以下の通りです。

プラットフォーム CacheDirectory AppDataDirectory
iOS Library/Caches ディレクト Library ディレクト
Android Context の CacheDir) Context の FilesDir)
UWP LocalCacheFolder ディレクト LocalFolder ディレクト

アプリケーションにバンドルされたファイル開く場合は、FileSystem.OpenAppPackageFileAsync メソッドを利用します。

using (var stream = await FileSystem.OpenAppPackageFileAsync("template.txt")))
{
    using (var reader = new StreamReader(stream))
    {
        var contents = await reader.ReadToEndAsync();
    }
}

補足説明:アプリケーションにファイルをバンドルする方法

iOS の場合

iOS プロジェクトの Resources フォルダにファイルを追加して、ビルドアクションを [BundleResource] に設定する必要があります。

resource-ios

build-action-ios

Android の場合

Android プロジェクトの Assetsフォルダにファイルを追加して、ビルドアクションを [AndroidAsset] に設定する必要があります。

resource-android

build-action-android

UWP の場合

UWP プロジェクトにファイルを追加して、ビルドアクションが [Content] に設定する必要があります。

resource-uwp

build-action-uwp

読んでみよう

FileSystem のコードを読んで、プラットフォーム固有の処理を見ていきます。

iOS

ディレクトリの検索に、NSSearchPath.GetDirectories メソッドが利用されています。

directory-ios

NSSearchPath.GetDirectories に渡す引数として、NSSearchPathDirectory 列挙体を指定しています。これはアプリケーション内にある特定のディレクトリを表す列挙体です。

アプリケーションにバンドルされたファイルの読み込みには、アプリケーションのルートディレクトリを NSBundle.MainBundle.BundlePath を利用して取得し、.NET の File.OpenRead() メソッドが利用されています。

file-read-ios

Android

ディレクトリの取得は、Context の CacheDir, FilesDir のプロパティから取得しています。

directory-android

ファイルの読み込みには、AssetManager の Open メソッドが利用されています。

file-read-android

UWP

ディレクトリの値は、 ApplicaitonData クラスのプロパティを利用しています。ApplicaitonData.Current でアプリケーションデータに関するオブジェクトを取得し、LocalCacheFolder, LocalFolder から取得されています。

directory-uwp

ファイルの読み込みは、アプリケーションのルートディレクトリを Package クラスの InstalledLocation プロパティで取得し、IStorageFolder インタフェースの OpenStreamForReadAsync メソッドを利用してファイルを開いています。

file-read-uwp

まとめ

  • Xamarin.Essentials のファイルシステムヘルパーでは、以下の機能が提供される
    • ディレクトリの取得(キャッシュ、アプリデータ)
    • バンドルされたファイルを開く
  • 内部では、以下のネイティブ固有のAPI を利用している
    • パスの取得
      • iOS:NSSearchPath.GetDirectories に NSSearchPathDirectory の値を指定
      • Android:Context.CacheDir, Context.FilesDir
      • UWP: ApplicationData.LocalCachePath, ApplicationData.LocalFolder
    • バンドルされたファイルを開く
      • iOS: NSBundle.MainBundle.BundlePath でパス取得、File.OpenRead (C#)
      • Android: AssetManager.Open を利用(AssetManager は、Context.Assets で取得)
      • UWP: IStorageFolder.OpenStreamForReadAsync (Package クラスの InstalledLocation でパスを取得)

参考