我用
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES );
NSString* theDesktopPath = [paths objectAtIndex:0];
它运作良好。但是当我使用 sudo 启动应用程序时,它会给出根的桌面路径。有什么方法可以始终返回当前用户的桌面(即使应用程序是使用 sudo 启动的)?
我用
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES );
NSString* theDesktopPath = [paths objectAtIndex:0];
它运作良好。但是当我使用 sudo 启动应用程序时,它会给出根的桌面路径。有什么方法可以始终返回当前用户的桌面(即使应用程序是使用 sudo 启动的)?
我使用下面的语句。
[NSURL fileURLWithPath:[NSHomeDirectory()stringByAppendingPathComponent:@"Desktop"]]
我会说没有办法做到这一点。但我可以解释我为什么这么认为。当您使用 NSUserDomain 时,它会缩小到活动用户的文件结构。因此,就像您说的那样,当您以 root 用户身份访问文件时,它会使用 root 的目录。它不能假设另一个用户的目录,因为如果有多个用户,它首先不知道哪个用户在运行它,因此不知道要访问哪个桌面目录。
我找到了一种对你有用的方法。NSSearchPathForDirectoriesInDomains
您必须使用环境变量自己构建路径,而不是使用。当您sudo
在 OS X 上使用时,它不会覆盖$HOME
变量,因此它会维护调用者的主目录。您可以访问所有环境变量
[[NSProcessInfo processInfo] environment];
和$HOME
得到
[[[NSProcessInfo processInfo] environment] objectForKey:@"HOME"];
因此,您可以将其作为字符串抓取$HOME
并附/Desktop
加到它。这在沙盒中无法正常工作,但由于您正在谈论以 root 身份运行它,我认为您不是。