2013-07-05 9 views
5

Io usoOttenere percorso del desktop per l'utente corrente su OS X

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

Funziona bene. Ma quando lancio l'applicazione con sudo fornisce il percorso desktop della root. C'è un modo per restituire il desktop dell'utente corrente sempre (anche se l'app è stata avviata con sudo)?

+0

probabilmente è possibile ottenere gli utenti attuali UID piuttosto che l'effettivo UID ... 'man getuid' –

+0

poi trovare il dir casa con: uno di questi' man getpwuid' –

risposta

3

Direi che non c'è modo di farlo. Ma posso spiegare perché lo penso. Quando si utilizza NSUserDomain si restringe alla struttura di file dell'utente attivo. Quindi, come hai detto tu quando accedi ai file come utente root, usa invece le directory di root. Non poteva assumere le directory di un altro utente perché se ci fossero più utenti non saprebbe che lo stava eseguendo in primo luogo e quindi non sa quale directory desktop accedere.

Ho trovato un modo per aggirare questo che dovrebbe funzionare per voi. Invece di usare lo NSSearchPathForDirectoriesInDomains dovrai costruire il tuo percorso usando le variabili d'ambiente. Quando si utilizza sudo su OS X, non sovrascrive la variabile $HOME in modo che mantenga la directory home del chiamante. È possibile accedere a tutte le variabili di ambiente con

[[NSProcessInfo processInfo] environment]; 

e ottenere $HOME con

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

Così si può afferrare $HOME come una stringa e aggiungere /Desktop ad esso. Questo non funzionerebbe correttamente in una sandbox ma, visto che stai parlando di eseguirlo come root, presumo che tu non lo sia.

3

Uso la seguente dichiarazione.

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

restituisce anche i percorsi in modalità sandbox come '/ Utenti/{utente}/Libreria/Contenitori/{app_bundle}/Dati/Desktop/'ed è fantastico! –