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

Posted

技术标签:

【中文标题】在 OSX 上的 C 代码中设置工作目录【英文标题】:Set working directory in C code on OSX 【发布时间】:2014-06-25 22:43:22 【问题描述】:

我正在从基于 SDL(+mixer) 的 C 语言 PC 应用程序中移植一些代码,这非常简单。但是,我对如何加载资源有点困惑。

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

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

如果那里有任何 OSX SDL 人员,您对此有什么建议吗?

【问题讨论】:

【参考方案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);

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

【讨论】:

像冠军一样工作,并与 ifdef 保持 x 平台兼容性!

以上是关于在 OSX 上的 C 代码中设置工作目录的主要内容,如果未能解决你的问题,请参考以下文章

单个目录指向多个git存储库

OSX Apache Virtualhost 仅返回默认页面

如何设置当前工作目录? [复制]

如何在 DataGrip 中设置 LOAD DATA 工作目录?

使用 Visual Studio 构建任务在 azure devops 中设置工作目录

要求在 R Studio 中设置工作目录 - 多个用户使用同一个 R 脚本