Как легко получить местоположение ресурса в Mac OS X, используя CoreFoundation? - PullRequest
0 голосов
/ 09 сентября 2011

Я передаю const char * значение в функцию, которая открывает указанный аудиофайл методом AudioFileOpenURL .Поэтому мне нужно значение CFURLRef.Но я использую относительный путь, например sounds / click.wav , но в этом случае AudioFileOpenURL не удается открыть файл (ошибка файла не найдена).Поэтому мне нужно расширить относительный путь и передать полный путь в этот метод.Лучшее решение, которое я нашел, было: получить URL-адрес комплекта, получить URL-адрес папки ресурса, создать CFURL из CFString, который был создан из байтов ..... очень раздражает.

    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);

Есть ли более простой способ сделатьтак?Потому что на айфоне следующий код:

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

работает как шарм.

1 Ответ

1 голос
/ 10 сентября 2011

Большая часть этой занятой работы по созданию строки CF происходит потому, что вы начинаете со строки C.Вместо этого начните с литерального CFString или NSString, и вы будете намного счастливее.

Как только вы передадите подпуть в свою функцию как CF / NSString, используйте CFURLCreateCopyAppendingPathComponent для добавления этого подпутина URL каталога ресурсов пакета.Полученный URL-адрес является URL-адресом звукового файла.

...