【问题标题】:Getting home directory in Mac OS X using C language使用 C 语言在 Mac OS X 中获取主目录
【发布时间】:2011-03-02 12:02:42
【问题描述】:

如何在XCode 编辑器中使用C 语言获取Mac OS X 中的主目录路径。

【问题讨论】:

标签: c macos home-directory


【解决方案1】:

这应该可以在 Linux、Unix 和 OS X 下运行,对于 Windows,您需要稍作修改。

#include <stdlib.h>
#include <stdio.h>    
#include <pwd.h>
#include <unistd.h>

int main(void)
{
    const char *homeDir = getenv("HOME");

    if (!homeDir) {
        struct passwd* pwd = getpwuid(getuid());
        if (pwd)
           homeDir = pwd->pw_dir;
    }
    printf("Home directory is %s\n", homeDir);
    return 0;
}

【讨论】:

    【解决方案2】:

    使用 FFSFindFolder:

    UInt8 path[1024];
    FSRef file;
    FSFindFolder( kOnAppropriateDisk , kCurrentUserFolderType , kCreateFolder , &file );
    FSRefMakePath( &file , path , sizeof(path) );
    

    使用 CSCopyUserName:

    char path[1024];
    CFStringRef name = CSCopyUserName( true );
    CFStringRef full = CFStringCreateWithFormat( NULL , NULL , CFSTR( "/Users/%@" ) , name );
    CFStringGetCString( full , path , sizeof(path) , kCFStringEncodingUTF8 );
    // release strings
    

    使用 NSHomeDirectory:

    char path[1024];
    CFStringGetCString( (CFStringRef)NSHomeDirectory() , path , sizeof(path) , kCFStringEncodingUTF8 );
    

    注意路径可以使用 UTF8 字符。

    【讨论】:

    • 请注意,NSHomeDirectory 具有误导性。它实际上返回的是应用程序目录,而不是当前用户的 homedir。
    • @jweyrich 仅适用于 iPhone。在普通 MacOS 上,它与其他 MacOS 相同。这些都不适用于 iPhone。
    • @drawnonward 是的!对不起,我认为它的工作方式相同。感谢您纠正我。
    • 请注意,CSCopyUserName() 不是查找用户主文件夹的解决方案。例如,它不会在 /Network/Users/leeg 找到我的。
    • 示例应该说明需要哪些包含文件。
    【解决方案3】:
    #include <stdlib.h>
    #include <stdio.h>    
    
    int main(void)
    {
        const char *homeDir = getenv("HOME");
    
        if (homeDir)
            printf("Home directory is %s\n", homeDir);
        else
            printf("Couldn't figure it out.\n");
    
        return 0;
    }
    

    【讨论】:

    • $ HOME=erased; ./app = 主目录已删除
    • 正如 jweyrich 所说,这并不可靠。不能保证 HOME 设置为主目录或完全设置。出于安全原因,服务器进程经常删除它们的环境。您应该使用getpwuid(),它返回密码结构,包括来自用户数据库的主目录。 developer.apple.com/mac/library/documentation/Darwin/Reference/…
    • POSIX 保证已设置,请参见此处:HOME The system shall initialize this variable at the time of login to be a pathname of the user's home directory。请注意,该页面上还显示“如果在执行应用程序或实用程序期间环境中存在以下两节中的变量,则应赋予它们以下所述的含义。”。
    • @JeremyP:也不能保证在 passwd 文件中设置了有效的主目录(在我的系统上,mysql 的主目录为 /nonexistent)。可以说,任何故意更改其HOME 的人都希望应用程序继续将其视为其实际主目录。
    • @dreamlax POSIX 不保证设置了 $HOME,只保证它是在用户的登录 shell 中设置的,并且只有在用户没有弄乱它的情况下。所以问题是你需要用户的真实主目录还是你想要用户告诉你的主目录是他们的主目录(我接受后者和前者都有合法的用例)。
    猜你喜欢
    • 2023-03-23
    • 2013-02-08
    • 2015-07-25
    • 1970-01-01
    • 2013-02-23
    • 2011-06-03
    • 2015-03-03
    • 2013-07-23
    相关资源
    最近更新 更多