Cocoaには、NSSearchPathForDirectoriesInDomains()
という便利な関数がある。この関数を使えばMacOSXの特別なフォルダへのパスを取得することができる。例えば、NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)
とすれば、/Users/username/Libraryというパス(を含んだNSArray)を得られる。
しかし、どうやらこの関数ではApplication Supportへのパスを取得できないらしい。Tigerであれば、引数にNSApplicationSupportDirectory
を渡してやればいいんだけど、Pantherではこれが使えない。
調べてみたところ、PantherでApplication Supportのパスを得るにはCarbonのAPIを使わなければいけないらしい。使ったことないよ、Carbon。
で、パスの取得にはCarbonのFSFindFolder()っていう関数を使うらしい。引数は4つあって、最初のkUserDomain
は上でいうNSUserDomainMask
にあたるもの(?)。kApplicationSupportFolderType
はNSApplicationSupportDirectory
だな。3番目の引数は、ディレクトリが存在しなかった場合にディレクトリを作成するかどうかを指定する。作成する場合はkCreateFolder
を、作成しない場合はkDontCreateFolder
を渡す。最後にFSRefのポインタを渡す。このポインタへディレクトリのパスが格納されるわけだ。
このFSRefってのはファイルやディレクトリへの参照を表すもので、AppleScriptでいうaliasクラスだ。FSRefはCFURLCreateFromFSRef()
という関数を使ってCFURLRefに変換することができる。ここまでくればあとは簡単。toll-free bridgeのおかげでCFURLRefはNSURLとして扱える。
FSRef fileRef; FSFindFolder(kUserDomain, kApplicationSupportFolderType, kCreateFolder, &fileRef); NSURL *fileURL = (NSURL *)CFURLCreateFromFSRef(kCFAllocatorDefault, &fileRef);
あとは、-relativePath
メソッドでパスを得ればOKだ。