「Xamarin.Macで特殊ディレクトリのパスを取得する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
1行目: 1行目:
== 実装:Environment.SpecialFolderを使う ==
+
 
 +
[[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メソッドで色々と取得することもできる。
 
[[Xamarin.Mac]]でもEnvironmentクラスのGetFolderPathメソッドで色々と取得することもできる。
 
マルチプラットフォームでの互換性を考慮すると、EnvironmentクラスのGetFolderPathメソッドで取得可能な特殊ディレクトリであれば、環境依存のAPIよりもこちらを使うのが望ましいと思われる。
 
マルチプラットフォームでの互換性を考慮すると、EnvironmentクラスのGetFolderPathメソッドで取得可能な特殊ディレクトリであれば、環境依存のAPIよりもこちらを使うのが望ましいと思われる。
105行目: 131行目:
 
ちなみに上記の列挙には以下のような[[ソースコード]]を用いた。
 
ちなみに上記の列挙には以下のような[[ソースコード]]を用いた。
 
<source lang="csharp">
 
<source lang="csharp">
            foreach (var folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
+
foreach (var folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
+
{
                var path = Environment.GetFolderPath((Environment.SpecialFolder)folder);
+
    var path = Environment.GetFolderPath((Environment.SpecialFolder)folder);
                Console.WriteLine("{0} => {1}", folder, path);
+
    Console.WriteLine("{0} => {1}", folder, path);
            }
+
}
 
</source>
 
</source>
  

2020年3月3日 (火) 05:06時点における版

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);
}

関連項目

参考文献