2012-03-19 41 views
3

这是我第一次使用Xcode,它令我感到非常震惊,这个IDE非常直观。我听说过去更好,我真的很希望。Xcode从我的家庭文件夹,而不是资源加载程序资源 - C++

我的问题是我的程序加载的资源,数据文件和.ini文件,它会自动在我的Home文件夹中搜索这些文件。我想让它在.app的资源文件夹中搜索这些文件。我使用的是C++,我发现的所有例子都是针对Objective-C的。

关于如何解决这个问题的任何想法?

回答

7

您可能会假设,当您的应用启动时,该进程的当前工作目录就是您的应用捆绑包。事实并非如此。 (没有做特别的Xcode - 这就是OS X是如何工作的。)

通常你会使用NSBundle(Objective-C的)或CFBundle(C) 寻找资源在您的应用程序包。由于您使用的是C++,因此我们使用C API。

查找网址在资源目录中的文件“myFile.ini”在您的应用程序捆绑:

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 
    } 
} 
+0

我不确定我在想什么。我的意思是,我知道一个默认的.exe会使用同一个文件夹中的资源。我知道OSX使用.app容器。感谢你的回答。这个C版本就是我之前和你交付的。 – 2012-03-19 07:35:32

+0

我讨厌问,但我会如何使用它。现在我有文件路径,它实际上代表了什么。我将如何打开文件流到该文件路径。 – 2012-03-19 08:00:32

+0

文件路径是类似“/path/to/my.app/Resources/myFile.ini”的字符串。你有没有特定的文件IO API?标准C和C++库中的工作正常,但还有很多其他的......因为您在讨论.exes和Windows,我认为您正在移植一些现有代码,并且如果该代码使用标准库,那么它应该只是工作。 – 2012-03-19 08:10:02