在C代码中检索应用程序支持目录(和其他)

时间:2012-01-22 01:02:34

标签: objective-c c macos

我需要从C代码中获取Application Support目录(所以我不相信我可以使用NSSearchPathForDirectoriesInDomains()等)。除了硬编码路径之外还有办法做到这一点(这样它可以考虑诸如沙盒之类的东西)吗?

2 个答案:

答案 0 :(得分:1)

Objective-C与C兼容。所以你可以简单地将你的调用包含在一个简单的C函数中NSSearchPathForDirectoriesInDomains() 返回一个const char *来从你的另一个中访问它(非Cocoa兼容) C代码。但是,您必须链接到相应的OSX库。

答案 1 :(得分:1)

虽然NSSearchPathForDirectoriesInDomains()是C函数,但它使用涉及自动释放池的Foundation调用,因此您无法从纯C代码调用它(嗯,您可以,但它会发出池泄漏警告)。所以简约的方法是创建一个小的包装器Obj-C文件:

#include <Foundation/Foundation.h>

CFArrayRef appSupport() {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   CFArrayRef a = (CFArrayRef) NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory ,NSUserDomainMask, YES);
   CFRetain(a);
   [pool release];
   return a;
}

然后你可以用纯C来处理其余部分,例如:

CFArrayRef a = appSupport();
if (CFArrayGetCount(a) > 0) { /* let's get the first value */
  CFStringRef s = CFArrayGetValueAtIndex(a, 0);
  char path[PATH_MAX];
  CFStringGetFileSystemRepresentation(s, path, sizeof(path));
  /* path now has what you want */
}
CFRelease(a);

我不知道任何可以提供路径的直接CF API。