MonoMac/特殊ディレクトリのパスを取得する

提供: MonoBook
移動: 案内検索

概要[編集]

MonoMacXamarin.Macに限らずあらゆるアプリでは、何かしらのデータを保存したりする場合には特殊ディレクトリを取得して、そこを起点にすることが基本となると思われる。

実装:NSSearchPathクラスのGetDirectoriesメソッドを使う[編集]

WindowsではEnvironmentクラスのGetFolderPathメソッドを使うとデスクトップやマイドキュメント、システムディレクトリなどの特殊ディレクトリの絶対パスを取得することができる。同様のことをMonoMacおよび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ディレクトリにデータを保存する場合はアプリごとにサブディレクトリを作って保存するのが望ましい。一部では企業名などでサブディレクトリを作っている事例も見かける。

アプリごとにサブディレクトリを作るのであれば、MonoMacのプロジェクトを作ると必ずある「Info.plist」の内容はNSBundleクラスで取得できるので、Preferencesディレクトリ風(NSUserDefaultsクラスでググれ)にBundle Identifierで区切ると良い感じかもしれない。

                var appDataDir = System.IO.Path.Combine(appSupportDir, NSBundle.MainBundle.BundleIdentifier);


実装:Environment.SpecialFolderを使う[編集]

MonoMacXamarin.MacでもEnvironmentクラスのGetFolderPathメソッドで色々と取得することもできる。 マルチプラットフォームでの互換性を考慮するとEnvironmentクラスのGetFolderPathメソッドで取得可能な特殊ディレクトリであればこちらを使いのがベストだと思われる。

.NET Frameworkでは標準的なEnvironment.SpecialFolderを使った場合に取得できる値を列挙する。 以下は2015年2月時点での値なので将来的に未対応のものを中心に値が追加される可能性はある。

Environment.SpecialFolder列挙体 Environment.GetFolderPathの戻り値
AdminTools 未対応、空文字が返ってくる
ApplicationData /Users/monobook/.config
CDBurning 未対応、空文字が返ってくる
CommonAdminTools 未対応、空文字が返ってくる
CommonApplicationData /usr/share
CommonDesktopDirectory 未対応、空文字が返ってくる
CommonDocuments 未対応、空文字が返ってくる
CommonMusic 未対応、空文字が返ってくる
CommonOemLinks 未対応、空文字が返ってくる
CommonPictures 未対応、空文字が返ってくる
CommonProgramFiles 未対応、空文字が返ってくる
CommonProgramFilesX86 未対応、空文字が返ってくる
CommonPrograms 未対応、空文字が返ってくる
CommonStartMenu 未対応、空文字が返ってくる
CommonStartup 未対応、空文字が返ってくる
CommonTemplates /usr/share/templates
CommonVideos 未対応、空文字が返ってくる
Cookies 未対応、空文字が返ってくる
Desktop /Users/monobook/Desktop
DesktopDirectory /Users/monobook/Desktop
Favorites /Users/monobook/Library/Favorites
Fonts /Users/monobook/Library/Fonts
History 未対応、空文字が返ってくる
InternetCache /Users/monobook/Library/Caches
LocalApplicationData /Users/monobook/.local/share
LocalizedResources 未対応、空文字が返ってくる
MyComputer 未対応、空文字が返ってくる
MyDocuments /Users/monobook
MyMusic /Users/monobook/Music
MyPictures /Users/monobook/Pictures
MyVideos /Users/monobook/Videos
NetworkShortcuts 未対応、空文字が返ってくる
PrinterShortcuts 未対応、空文字が返ってくる
ProgramFiles /Applications
ProgramFilesX86 未対応、空文字が返ってくる
Programs 未対応、空文字が返ってくる
Recent 未対応、空文字が返ってくる
Resources 未対応、空文字が返ってくる
SendTo 未対応、空文字が返ってくる
StartMenu 未対応、空文字が返ってくる
Startup 未対応、空文字が返ってくる
System 未対応、空文字が返ってくる
SystemX86 未対応、空文字が返ってくる
Templates /Users/monobook/Templates
UserProfile /Users/monobook
Windows 未対応、空文字が返ってくる

ちなみに上記の列挙には以下のようなソースコードを用いた。

            foreach (var folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                var path = Environment.GetFolderPath((Environment.SpecialFolder)folder);
                Console.WriteLine("{0} => {1}", folder, path);
            }

関連項目[編集]

参考文献[編集]