从C++中寻找“~/库/应用程序支持”?

sz81bmfz  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(135)

我写了一个GTKmm应用程序,我正在尝试创建一些OS X增强功能。我想将配置文件存储在Application Support/myApp文件夹中,但我不知道找到该文件夹的正确方法。
我试着浏览核心基金会库(我正在使用它来获取我的myApp.app路径),但我什么也找不到。

c9qzyr3d

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,它还是可以完成任务。

ozxc1zmp

ozxc1zmp2#

用于此操作的函数似乎是NSSearchPathForDirectoriesInDomains(或同一页上列出的其他一些函数),参数为NSApplicationSupportDirectory

prdp8dxp

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

guykilcj4#

这不是应用程序支持,但你可能不想在那里存储文件,而是使用你通过调用“HOME”得到的目录:
您可以使用C函数getenv:第一个月
要获取C++字符串,请用途:string(home)

of1yzvn4

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

相关问题