在macOS上获取当前用户的桌面路径

时间:2013-07-05 14:30:22

标签: objective-c cocoa

我用

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES );
NSString* theDesktopPath = [paths objectAtIndex:0];

效果很好。但是当我使用sudo启动应用程序时,它会提供root的桌面路径。有没有办法永远返回当前用户的桌面(即使应用程序是以sudo启动的)?

2 个答案:

答案 0 :(得分:6)

我使用下面的陈述。

[NSURL fileURLWithPath:[NSHomeDirectory()stringByAppendingPathComponent:@"Desktop"]]

答案 1 :(得分:4)

我想说没有办法做到这一点。但我可以解释为什么我这么想。当您使用NSUserDomain时,它会缩小到活动用户的文件结构。就像你说的那样,当你以root用户身份访问文件时,它会使用root的目录。它不能假设另一个用户的目录,因为如果有多个用户,它将不知道哪个用户首先运行它,因此不知道要访问哪个桌面目录。

我找到了解决这个问题的方法。而不是使用NSSearchPathForDirectoriesInDomains,您将不得不使用环境变量自己构建路径。在OS X上使用sudo时,它不会覆盖$HOME变量,因此它会维护调用者的主目录。您可以使用

访问所有环境变量
[[NSProcessInfo processInfo] environment];

并使用

获取$HOME
[[[NSProcessInfo processInfo] environment] objectForKey:@"HOME"];

因此,您可以将$HOME作为字符串抓取并将/Desktop附加到其中。这在沙盒中无法正常工作,但由于您正在谈论以root身份运行它,我认为您不是。