Получение пути рабочего стола для текущего пользователя на macOS

Я использую

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

Он работает хорошо. Но когда я запускаю приложение с sudo, оно дает путь к рабочему столу root. Есть ли способ вернуть рабочий стол текущего пользователя всегда (даже если приложение запускается с sudo)?

2 ответов


Я бы сказал, что нет никакого способа сделать это. Но я могу объяснить, почему я так думаю. При использовании NSUserDomain он сужается до структуры файла активного пользователя. Как вы сказали, когда вы получаете доступ к файлам в качестве пользователя root, он использует каталоги root. Он не мог предполагать каталоги другого пользователя, потому что если бы было несколько пользователей, он не знал бы, который запускает его в первую очередь, и поэтому не знает, к какому каталогу рабочего стола получить доступ.

я нашел способ вокруг этого это должно работать для вас. Вместо использования NSSearchPathForDirectoriesInDomains вам придется построить свой путь самостоятельно, используя переменные среды. Когда вы используете sudo в OS X он не перезаписывает $HOME переменная, поэтому она поддерживает домашний каталог вызывающего абонента. Вы можете получить доступ ко всем переменным среды с помощью

[[NSProcessInfo processInfo] environment];

и вам $HOME С

[[[NSProcessInfo processInfo] environment] objectForKey:@"HOME"];

, чтобы забрать $HOME в виде строки и добавления /Desktop к нему. Это не будет работать правильно в песочнице, но поскольку вы говорите о запуске его как root, я предполагаю, что это не так.


Я использую приведенную ниже инструкцию.

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