在OSX上的C代码中设置工作目录

时间:2014-06-25 22:43:23

标签: macos sdl-2

我从基于SDL(+调音台)的C语言PC应用程序移植了一些代码,这非常简单。但是,我对如何加载资源感到有点难过。

原始代码将其资源放在子目录中 - graphics /,sound /等。然后代码加载引用子目录的资源,例如Mix_LoadWAV(sounds/zap.waz)。精灵以类似的方式处理,使用fopen(" graphics / stars.pcx")然后处理数据。

在Mac上,这些失败并找不到文件。我假设这是因为工作目录位于错误的位置,或者fopen需要完整的路径?

如果有任何OSX SDL人员,你对此有什么指示吗?

1 个答案:

答案 0 :(得分:1)

fopen()不需要完整路径。你可能是正确的,工作目录不是应用程序所期望的(虽然我不会说它是“错误的”,因为除了从命令行启动程序时,工作目录没有任何期望,用户控制它)。

改变工作目录的POSIX方式是:

#include <unistd.h>

int chdir(const char *path);

要发现应用程序包的路径,请使用Core Foundation的CFBundle API。所以,像这样:

#include <unistd.h>
#include <CoreFoundation/CoreFoundation.h>

...
CFURLRef url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
char path[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(url, true, (UInt8*)path, sizeof(path)) ||
    chdir(path) != 0)
    /* handle error */;
CFRelease(url);

这里我使用了app bundle(YourApp.app/Contents/Resources)中的Resources目录的路径。如果那不是您的资源文件实际所在的位置,那么您将使用其他CFBundle函数之一。