2010-06-11 6 views
7

Wie kann ich den Pfad des Home-Verzeichnisses in Mac OS X mit C Sprache in XCode Editor erhalten.Wie bekomme ich den Home-Verzeichnis in Mac OS X mit C Sprache?

+2

Nehmen Sie ein paar tiefe Atemzüge, Jonathan ... – mipadi

+0

Aktuelle akzeptierte Antwort ist ungültig, aber es ist eine andere ähnliche Frage, die noch offen ist http://stackoverflow.com/questions/3726113/getting- current-user-home-Verzeichnis-on-os-x – sorin

+0

@JonathanSterling Ich dachte, der Zweck von stackoverflow war es, Leuten zu helfen, sie nicht zu verscheuchen – MickyD

Antwort

6
#include <stdlib.h> 
#include <stdio.h>  

int main(void) 
{ 
    const char *homeDir = getenv("HOME"); 

    if (homeDir) 
     printf("Home directory is %s\n", homeDir); 
    else 
     printf("Couldn't figure it out.\n"); 

    return 0; 
} 
+3

'$ HOME = gelöscht; ./app' = Home-Verzeichnis ist gelöscht – jweyrich

+7

Wie jweyrich sagt, ist dies nicht zuverlässig. Es gibt keine Garantie, dass HOME auf das Home-Verzeichnis eingestellt ist oder dass es überhaupt eingestellt ist. Serverprozesse löschen häufig ihre Umgebung aus Sicherheitsgründen. Sie sollten 'getpwuid()' verwenden, das die Passwortstruktur einschließlich des Home-Verzeichnisses aus der Benutzerdatenbank zurückgibt. http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/getpwuid.3.html – JeremyP

+0

POSIX garantiert, dass es gesetzt ist, siehe hier: ['HOME' Das System soll diese Variable initialisieren zum Zeitpunkt der Anmeldung als Pfadname des Benutzerverzeichnisses des Benutzers] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html). Beachten Sie, dass auf dieser Seite auch angegeben wird: "Wenn die Variablen in den folgenden zwei Abschnitten in der Umgebung während der Ausführung einer Anwendung oder eines Dienstprogramms vorhanden sind, erhalten sie die unten beschriebene Bedeutung." – dreamlax

8

mit FSFindFolder:

UInt8 path[1024]; 
FSRef file; 
FSFindFolder(kOnAppropriateDisk , kCurrentUserFolderType , kCreateFolder , &file); 
FSRefMakePath(&file , path , sizeof(path)); 

mit CSCopyUserName:

char path[1024]; 
CFStringRef name = CSCopyUserName(true); 
CFStringRef full = CFStringCreateWithFormat(NULL , NULL , CFSTR("/Users/%@") , name); 
CFStringGetCString(full , path , sizeof(path) , kCFStringEncodingUTF8); 
// release strings 

mit NSHomeDirectory:

char path[1024]; 
CFStringGetCString((CFStringRef)NSHomeDirectory() , path , sizeof(path) , kCFStringEncodingUTF8); 

beachten Sie, dass der Pfad UTF8-Zeichen verwenden können.

+0

Beachten Sie, dass "NSHomeDirectory" irreführend ist. Es gibt tatsächlich das Anwendungsverzeichnis zurück, nicht den aktuellen Benutzer homedir. – jweyrich

+2

@jweyrich das gilt nur für iPhone. Auf normalem MacOS entspricht es den anderen. Keine davon funktioniert auf dem iPhone. – drawnonward

+0

@drainonward Aye! Entschuldigung, ich dachte, es funktioniert genauso. Danke, dass du mich verbessert hast. – jweyrich

11

Dies sollte unter Linux, Unix und OS X funktionieren, für Windows müssen Sie eine kleine Änderung vornehmen.

#include <stdlib.h> 
#include <stdio.h>  
#include <pwd.h> 
#include <unistd.h> 

int main(void) 
{ 
    const char *homeDir = getenv("HOME"); 

    if !homeDir { 
     struct passwd* pwd = getpwuid(getuid()); 
     if (pwd) 
      homeDir = pwd->pw_dir; 
    } 
    printf("Home directory is %s\n", homeDir); 
    return 0; 
} 

+0

Sie müssen # # einschließen '. – Ant