「Xamarin.Macで特殊ディレクトリのパスを取得する」の版間の差分
Administrator (トーク | 投稿記録) 細 Administrator がページ「Xamarin.Mac/特殊ディレクトリのパスを取得する」を「Xamarin.Macで特殊ディレクトリのパスを取得する」に移動しました |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| (同じ利用者による、間の1版が非表示) | |||
| 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))) | |||
{ | |||
var path = Environment.GetFolderPath((Environment.SpecialFolder)folder); | |||
Console.WriteLine("{0} => {1}", folder, path); | |||
} | |||
</source> | </source> | ||
== 関連項目 == | == 関連項目 == | ||
* [[Xamarin. | * [[Xamarin.Androidで特殊ディレクトリのパスを取得する]] | ||
* [[Xamarin. | * [[Xamarin.MacでNLogを使う]] | ||
* [[Xamarin. | * [[Xamarin.Macでplistファイルを読み書きする]] | ||
[[category:Xamarin.Mac]] | [[category:Xamarin.Mac]] | ||
2021年4月20日 (火) 07:15時点における最新版
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);
}