我用
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES );
NSString* theDesktopPath = [paths objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
它运作良好.但是当我使用sudo启动应用程序时,它会提供root的桌面路径.有没有办法永远返回当前用户的桌面(即使应用程序是用sudo启动的)?
我使用下面的声明.
[NSURL fileURLWithPath:[NSHomeDirectory()stringByAppendingPathComponent:@"Desktop"]]
Run Code Online (Sandbox Code Playgroud)
我想说没有办法做到这一点。但我可以解释一下我为什么这么想。当您使用 NSUserDomain 时,它会缩小到活动用户的文件结构。正如您所说,当您以 root 用户身份访问文件时,它会使用 root 的目录。它无法假设另一个用户的目录,因为如果有多个用户,它就不知道哪个用户首先运行它,因此不知道要访问哪个桌面目录。
我找到了一种适合您的解决方法。您必须使用NSSearchPathForDirectoriesInDomains环境变量自行构建路径,而不是使用 。当您sudo在 OS X 上使用时,它不会覆盖$HOME变量,因此它会维护调用者的主目录。您可以使用以下命令访问所有环境变量
[[NSProcessInfo processInfo] environment];
Run Code Online (Sandbox Code Playgroud)
并$HOME与
[[[NSProcessInfo processInfo] environment] objectForKey:@"HOME"];
Run Code Online (Sandbox Code Playgroud)
所以你可以抓取$HOME字符串并附加到/Desktop它上面。这在沙箱中无法正常工作,但既然您正在谈论以 root 身份运行它,我认为您不是。