在 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 代码中设置工作目录的主要内容,如果未能解决你的问题,请参考以下文章
OSX Apache Virtualhost 仅返回默认页面
如何在 DataGrip 中设置 LOAD DATA 工作目录?