Хотя 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, который дал бы путь.