如何使用CoreFoundation轻松获取mac os x中的资源位置?

时间:2011-09-09 09:14:42

标签: macos core-foundation

我将 const char * 值传递给函数,该函数使用 AudioFileOpenURL 方法打开指定的音频文件。所以我需要一个CFURLRef值。但我正在使用相对路径,比如 声音/ click.wav 但在这种情况下 AudioFileOpenURL 无法打开文件(找不到文件错误)。所以我需要扩展相对路径并将完整路径传递给此方法。我找到的最佳解决方案是: 获取bundle url,获取资源文件夹url,从CFString构造CFURL,这是从字节构造的.....非常讨厌。

    CFBundleRef bundle = CFBundleGetMainBundle();

CFURLRef bundleUrl = CFBundleCopyBundleURL(bundle);
CFURLRef resUrl = CFBundleCopyResourcesDirectoryURL(bundle);
CFStringRef cfsName = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8*)inFilePath, strlen(inFilePath), kCFStringEncodingASCII, 1);

CFMutableStringRef fileName =  CFStringCreateMutableCopy(kCFAllocatorDefault, 0, CFURLGetString(bundleUrl));
CFStringAppend(fileName, CFURLGetString(resUrl));
CFStringAppend(fileName, cfsName);

CFURLRef theURL = CFURLCreateWithString(kCFAllocatorDefault, fileName, 0);

CFRelease(fileName);
CFRelease(cfsName);
CFRelease(resUrl);
CFRelease(bundleUrl);

有更简单的方法吗?因为在iPhone上有下一个代码:

CFURLRef theURL = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (UInt8*)inFilePath, strlen(inFilePath), false);

像魅力一样工作。

1 个答案:

答案 0 :(得分:1)

大多数CF字符串创建繁忙工作是因为你是从C字符串开始的。从literal CFString或NSString开始,你会更开心。

将子路径作为CF / NSString传递给函数后,使用CFURLCreateCopyAppendingPathComponent将该子路径附加到bundle的资源目录URL。生成的URL是声音文件的URL。