访问mac osx app bundle中的resources文件夹中的文件

时间:2014-06-11 14:34:10

标签: c++ macos qt

我想访问应用包中的Resources内部的文件。不幸的是我不能使用QT resorces,因为我正在使用opencv的CascadeClassifier。我目前的路径是

const std::string FACE_CLASIFIER_PATH = "/Resources/haarcascade_frontalface_default.xml";
const std::string EYES_CLASIFIER_PATH = "/Resources/haarcascade_mcs_eyepair_big.xml";

我也试过

const std::string FACE_CLASIFIER_PATH = "../Resources/haarcascade_frontalface_default.xml";
const std::string EYES_CLASIFIER_PATH = "../Resources/haarcascade_mcs_eyepair_big.xml";

但是他们有点工作了。至于配置这两个文件都存在于MyApp.app/Contents/Resources中,我使用qmake

包含它们
mac {
APP_XML_FILES.files = ../haarcascade_frontalface_default.xml ../haarcascade_mcs_eyepair_big.xml
APP_XML_FILES.path = Contents/Resources
QMAKE_BUNDLE_DATA += APP_XML_FILES
}

感谢您对此问题的任何帮助

1 个答案:

答案 0 :(得分:5)

你没有说你想对这些文件做什么,但这可能是由于我对opencv缺乏了解。但是,您可以使用Core Foundation类获取资源文件夹中文件的路径: -

CFURLRef appUrlRef;
appUrlRef = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("somefile"), NULL, NULL);

// do something with the file
//...

// Ensure you release the reference
CFRelease(appUrlRef);

使用CFURLRef,您可以使用Apple's documentation从中获取所需内容。

例如,如果您需要文件路径: -

CFStringRef filePathRef = CFURLCopyPath(appUrlRef);

//始终释放使用"create or "copy" in its nam e函数检索的项目    CFRelease(filePathRef);

从文件路径中,我们可以获得路径的char *: -

const char* filePath = CFStringGetCStringPtr(filePathRef, kCFStringEncodingUTF8);

所以,如果你想获得haarcascade_mcs_eyepair_big.xml的char *路径,那就把它们放在一起吧: -

CFURLRef appUrlRef = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("haarcascade_mcs_eyepair_big.xml"), NULL, NULL);
CFStringRef filePathRef = CFURLCopyPath(appUrlRef);
const char* filePath = CFStringGetCStringPtr(filePathRef, kCFStringEncodingUTF8);

// Release references
CFRelease(filePathRef);
CFRelease(appUrlRef);