Pages

2006-03-23

Application Supportへのパスを得る

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にあたるもの(?)。kApplicationSupportFolderTypeNSApplicationSupportDirectoryだな。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だ。

0 件のコメント:

コメントを投稿