Xamarin.Macで特殊ディレクトリのパスを取得する
Xamarin.Macに限らずあらゆるアプリでは、何かしらのデータを保存したりする場合には特殊ディレクトリを取得して、そこを起点にすることが基本となると思われる。
実装:NSSearchPathクラスのGetDirectoriesメソッドを使う[編集 | ソースを編集]
WindowsではEnvironmentクラスのGetFolderPathメソッドを使うとデスクトップやマイドキュメント、システムディレクトリなどの特殊ディレクトリの絶対パスを取得することができる。同様のことをXamarin.Macで行う場合にはNSSearchPathクラスのGetDirectoriesメソッドを使う。
NSSearchPathクラスのGetDirectoriesメソッドを使いユーザーディレクトリ配下の「Application Support」ディレクトリ(~/Library/Application Support)を取得するには以下のような感じになる。
var appSupportDir = NSSearchPath.GetDirectories(
directory : NSSearchPathDirectory.ApplicationSupportDirectory,
domainMask: NSSearchPathDomain.User
).FirstOrDefault();
NSSearchPathクラスのGetDirectoriesメソッドの戻り値は配列なので注意する必要がある。domainMask引数で取得範囲をユーザーディレクトリに限定しているので戻り値は1個しか返ってこないはずであり、LINQでFirstOrDefaultしてしまうのが手っ取り早い。
備考[編集 | ソースを編集]
上記のApplication Supportディレクトリにデータを保存する場合はアプリごとにサブディレクトリを作って保存するのが望ましい。一部では企業名などでサブディレクトリを作っている事例も見かける。
アプリごとにサブディレクトリを作るのであれば、Xamarinのプロジェクトを作ると必ずある「Info.plist」の内容はNSBundleクラスで取得できるので、Preferencesディレクトリ風(NSUserDefaultsクラスでググれ)にBundle Identifierで区切ると良い感じかもしれない。
var appDataDir = System.IO.Path.Combine(
appSupportDir,
NSBundle.MainBundle.BundleIdentifier);
実装:Environment.SpecialFolderを使う[編集 | ソースを編集]
Xamarin.MacでもEnvironmentクラスのGetFolderPathメソッドで色々と取得することもできる。 マルチプラットフォームでの互換性を考慮すると、EnvironmentクラスのGetFolderPathメソッドで取得可能な特殊ディレクトリであれば、環境依存のAPIよりもこちらを使うのが望ましいと思われる。 以下は2017年2月時点での値なので将来的に未対応のものに値が追加される可能性はある。
| Environment.SpecialFolder列挙体 | Environment.GetFolderPathの戻り値 |
|---|---|
| Desktop | /Users/{ユーザー}/Desktop |
| Programs | |
| MyDocuments | /Users/{ユーザー} |
| MyDocuments | /Users/{ユーザー} |
| Favorites | /Users/{ユーザー}/Library/Favorites |
| Startup | |
| Recent | |
| SendTo | |
| StartMenu | |
| MyMusic | /Users/{ユーザー}/Music |
| MyVideos | /Users/{ユーザー}/Videos |
| DesktopDirectory | /Users/{ユーザー}/Desktop |
| MyComputer | |
| NetworkShortcuts | |
| Fonts | /Users/{ユーザー}/Library/Fonts |
| Templates | /Users/{ユーザー}/Templates |
| CommonStartMenu | |
| CommonPrograms | |
| CommonStartup | |
| CommonDesktopDirectory | |
| ApplicationData | /Users/{ユーザー}/.config |
| PrinterShortcuts | |
| LocalApplicationData | /Users/{ユーザー}/.local/share |
| InternetCache | /Users/{ユーザー}/Library/Caches |
| Cookies | |
| History | |
| CommonApplicationData | /usr/share |
| Windows | |
| System | |
| ProgramFiles | /Applications |
| MyPictures | /Users/{ユーザー}/Pictures |
| UserProfile | /Users/{ユーザー} |
| SystemX86 | |
| ProgramFilesX86 | |
| CommonProgramFiles | |
| CommonProgramFilesX86 | |
| CommonTemplates | /usr/share/templates |
| CommonDocuments | |
| CommonAdminTools | |
| AdminTools | |
| CommonMusic | |
| CommonPictures | |
| CommonVideos | |
| Resources | |
| LocalizedResources | |
| CommonOemLinks | |
| CDBurning |
ちなみに上記の列挙には以下のようなソースコードを用いた。
foreach (var folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
{
var path = Environment.GetFolderPath((Environment.SpecialFolder)folder);
Console.WriteLine("{0} => {1}", folder, path);
}