アプリケーションバンドル内のファイルの参照

MacOS Xのアプリケーションというのは、実はフォルダです(そうでないものありますが)。アプリケーションのアイコンからポップアップメニューを開くと「パッケージの内容を表示」と出るものがそうです。「バンドル」と言ったりもします。アプリケーションは必ずしも一つのファイルで成り立つわけではないので、Windowsなどでは同じフォルダにファイルを置いたりしますが、MacOS Xではそれをアプリケーションの中に入れることができます。見た目すっきり。
基本的にはアプリケーションバンドル内の Resource フォルダに入れます(xcodeなどで設定したりします)。例えば、hoge.txt というファイルがあったとして、これを参照する方法は、

CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef urlRef = CFBundleCopyResourceURL(mainBundle, CFSTR("hoge"), CFSTR("txt"), NULL);

となります。拡張子を分けて指定しなければいけないのがちょっと気持ち悪い。ちなみに、CFURLRef ファイルの位置などを指定する文字列です。UTF-8エンコードされているので、日本語のファイル名もちゃんと参照出来ます。しかし、これを使ってファイルをロードすることは出来ません。FSRefというものに変更する必要があります。

FSRef fsRef;
CFURLGetFSRef(urlRef, &fsRef);

これだけです。