差分

ナビゲーションに移動 検索に移動

Xamarin.Macで特殊ディレクトリのパスを取得する

2,152 バイト追加, 2020年3月3日 (火) 05:06
編集の要約なし
 [[Xamarin.Mac]]に限らずあらゆる[[アプリ]]では、何かしらの[[データ]]を保存したりする場合には特殊ディレクトリを取得して、そこを起点にすることが基本となると思われる。 ==実装:NSSearchPathクラスのGetDirectoriesメソッドを使う==[[Windows]]ではEnvironmentクラスのGetFolderPathメソッドを使うとデスクトップやマイドキュメント、システムディレクトリなどの特殊ディレクトリの絶対パスを取得することができる。同様のことを[[Xamarin.Mac]]で行う場合にはNSSearchPathクラスのGetDirectoriesメソッドを使う。 NSSearchPathクラスのGetDirectoriesメソッドを使いユーザーディレクトリ配下の「Application Support」ディレクトリ(~/Library/Application Support)を取得するには以下のような感じになる。<source lang="csharp">var appSupportDir = NSSearchPath.GetDirectories( directory : NSSearchPathDirectory.ApplicationSupportDirectory, domainMask: NSSearchPathDomain.User).FirstOrDefault();</source> NSSearchPathクラスのGetDirectoriesメソッドの[[戻り値]]は[[配列]]なので注意する必要がある。domainMask引数で取得範囲をユーザーディレクトリに限定しているので戻り値は1個しか返ってこないはずであり、[[LINQ]]でFirstOrDefaultしてしまうのが手っ取り早い。 ===備考===上記のApplication Supportディレクトリに[[データ]]を保存する場合はアプリごとにサブディレクトリを作って保存するのが望ましい。一部では企業名などでサブディレクトリを作っている事例も見かける。 アプリごとにサブディレクトリを作るのであれば、[[Xamarin]]のプロジェクトを作ると必ずある「Info.plist」の内容はNSBundleクラスで取得できるので、Preferencesディレクトリ風(NSUserDefaultsクラスで[[ググれ]])にBundle Identifierで区切ると良い感じかもしれない。<source lang="csharp">var appDataDir = System.IO.Path.Combine( appSupportDir, NSBundle.MainBundle.BundleIdentifier);</source> == 実装:Environment.SpecialFolderを使う ==
[[Xamarin.Mac]]でもEnvironmentクラスのGetFolderPathメソッドで色々と取得することもできる。
マルチプラットフォームでの互換性を考慮すると、EnvironmentクラスのGetFolderPathメソッドで取得可能な特殊ディレクトリであれば、環境依存のAPIよりもこちらを使うのが望ましいと思われる。
ちなみに上記の列挙には以下のような[[ソースコード]]を用いた。
<source lang="csharp">
foreach (var folder in Enum.GetValues(typeof(Environment.SpecialFolder))) { var path = Environment.GetFolderPath((Environment.SpecialFolder)folder); Console.WriteLine("{0} => {1}", folder, path); }
</source>

案内メニュー