我写了一个GTKmm应用程序,我正在尝试创建一些OS X增强功能。我想将配置文件存储在Application Support/myApp文件夹中,但我不知道找到该文件夹的正确方法。我试着浏览核心基金会库(我正在使用它来获取我的myApp.app路径),但我什么也找不到。
c9qzyr3d1#
在C/C++中执行此操作的正确方法:
#include <CoreServices/CoreServices.h> FSRef ref; OSType folderType = kApplicationSupportFolderType; char path[PATH_MAX]; FSFindFolder( kUserDomain, folderType, kCreateFolder, &ref ); FSRefMakePath( &ref, (UInt8*)&path, PATH_MAX ); // You now have ~/Library/Application Support stored in 'path'
当然,这些都是非常老的API,苹果不再推荐使用它们。尽管如此,如果你想在代码库中完全避免使用Objective-C,它还是可以完成任务。
ozxc1zmp2#
用于此操作的函数似乎是NSSearchPathForDirectoriesInDomains(或同一页上列出的其他一些函数),参数为NSApplicationSupportDirectory。
NSApplicationSupportDirectory
prdp8dxp3#
在OS-X中包含的BSD Unix中,您可以使用以下命令获取运行程序的用户的主目录:
struct passwd *p = getpwuid(getuid()); /* defined in pwd.h, and requires sys/types.h */ char *home = p->pw_dir;
使用这个函数,你可以用这个函数代替~来构造路径
char *my_app_name = "WHATEVER"; char app_support[MAXPATHLEN]; /* defined in sys/param.h */ snprintf(app_support,MAXPATHLEN,"%s/Library/Application Support/%s", home, my_app_name);
guykilcj4#
这不是应用程序支持,但你可能不想在那里存储文件,而是使用你通过调用“HOME”得到的目录:您可以使用C函数getenv:第一个月要获取C++字符串,请用途:string(home)
string(home)
of1yzvn45#
未被弃用的解决方案
#include <sysdir.h> // for sysdir_start_search_path_enumeration #include <glob.h> // for glob needed to expand ~ to user dir std::string expandTilde(const char* str) { if (!str) return {}; glob_t globbuf; if (glob(str, GLOB_TILDE, nullptr, &globbuf) == 0) { std::string result(globbuf.gl_pathv[0]); globfree(&globbuf); return result; } else { throw std::exception("Unable to expand tilde"); } } std::string settingsPath(const char* str) { char path[PATH_MAX]; auto state = sysdir_start_search_path_enumeration(SYSDIR_DIRECTORY_APPLICATION_SUPPORT, SYSDIR_DOMAIN_MASK_USER); if ((state = sysdir_get_next_search_path_enumeration(state, path))) { return expandTilde(path); } else { throw std::exception("Failed to get settings folder"); } }
5条答案
按热度按时间c9qzyr3d1#
在C/C++中执行此操作的正确方法:
当然,这些都是非常老的API,苹果不再推荐使用它们。尽管如此,如果你想在代码库中完全避免使用Objective-C,它还是可以完成任务。
ozxc1zmp2#
用于此操作的函数似乎是NSSearchPathForDirectoriesInDomains(或同一页上列出的其他一些函数),参数为
NSApplicationSupportDirectory
。prdp8dxp3#
在OS-X中包含的BSD Unix中,您可以使用以下命令获取运行程序的用户的主目录:
使用这个函数,你可以用这个函数代替~来构造路径
guykilcj4#
这不是应用程序支持,但你可能不想在那里存储文件,而是使用你通过调用“HOME”得到的目录:
您可以使用C函数getenv:第一个月
要获取C++字符串,请用途:
string(home)
of1yzvn45#
未被弃用的解决方案