おそらく、あなたのアプリが起動したときに、プロセスの現在の作業ディレクトリがあなたのアプリのバンドルであると仮定しています。そうではありません。 (特にXcodeのとは何の関係も。 - それはOS Xが動作するだけの方法です)
は、一般的に、あなたのアプリケーションバンドル内のリソースを見つけることNSBundle
(のObjective-C)またはCFBundle
(C) を使用しないだろう。 C++を使用しているので、C APIを使用しましょう。
は、あなたのアプリケーションバンドル内のリソースディレクトリ内のファイル「MYFILE.INI」へのURLを検索するには:
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("myFile"), CFSTR("ini"), NULL);
UInt8 filePath[PATH_MAX];
if (CFURLGetFileSystemRepresentation(url, true, filePath, sizeof(filePath)))
{
// use your API of choice to open and read the file at filePath
}
それとも、単にあなたのアプリケーションバンドルにCWDを変更するには:
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyBundleURL(mainBundle);
UInt8 bundlePath[PATH_MAX];
if (CFURLGetFileSystemRepresentation(url, true, bundlePath, sizeof(bundlePath)))
{
if (chdir((const char*)bundlePath) == 0)
{
// now the CWD is your app bundle, and you can use relative path names to access files inside it
}
}
私は何を考えていたのか分かりません。つまり、デフォルトで.exeは同じフォルダにあるリソースを使用することがわかります。私はOSXが.appコンテナを使用していることを知っています。答えをありがとう。これのCバージョンは私が後にしたものでした。 –
私は尋ねるのが嫌いですが、どうすれば実際に使うのですか?私はファイルパスを持っているので、実際には何を表していますか?そのfilePathへのファイルストリームをどのように開くのですか? –
ファイルパスは "/path/to/my.app/Resources/myFile.ini"のような文字列です。特定のファイルIO APIを念頭に置いていますか?標準のCおよびC++ライブラリのものはうまく動作しますが、他にもたくさんのものがあります。あなたが.exesとWindowsについて話していたので、既存のコードを移植していたと仮定しました。それだけで動作するはずです。 –