2010-06-11 9 views
7

¿Cómo puedo obtener la ruta del directorio principal en Mac OS X usando el idioma C en el editor XCode?Obteniendo el directorio de inicio en Mac OS X usando el lenguaje C

+2

Tome algunas respiraciones profundas, Jonathan ... – mipadi

+0

respuesta aceptada actual no es válido pero hay otra pregunta similar que todavía está abierto http://stackoverflow.com/questions/3726113/getting- actual-usuario-home-directory-on-os-x – sorin

+0

@JonathanSterling Pensé que el propósito de stackoverflow era ayudar a las personas a no asustarlos – MickyD

Respuesta

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 = borrado; ./app' = El directorio de inicio se borra – jweyrich

+7

Como dice jweyrich, esto no es confiable. No hay garantía de que HOME esté configurado en el directorio de inicio o de que esté configurado. Los procesos del servidor a menudo eliminan su entorno por razones de seguridad. Debería usar 'getpwuid()' que devuelve la estructura de contraseña incluyendo el directorio de inicio de la base de datos de usuario. http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/getpwuid.3.html – JeremyP

+0

POSIX garantiza que está configurado, consulte aquí: ['HOME' El sistema debe inicializar esta variable en el momento del inicio de sesión para ser una ruta de acceso del directorio de inicio del usuario] (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html). Tenga en cuenta que en esa página también dice "Si las variables en las dos secciones siguientes están presentes en el entorno durante la ejecución de una aplicación o utilidad, se les dará el significado que se describe a continuación". – dreamlax

8

con FSFindFolder:

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

con CSCopyUserName:

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

con NSHomeDirectory:

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

nota que el camino puede utilizar caracteres UTF8.

+0

Tenga en cuenta que 'NSHomeDirectory' es engañoso. En realidad, devuelve el directorio de la aplicación, no el usuario actual homedir. – jweyrich

+2

@jweyrich que solo se aplica al iPhone. En MacOS normal es el equivalente de los demás. Ninguno de estos funciona en iPhone. – drawnonward

+0

@drawnonward ¡Sí! Lo siento, pensé que funcionaba de la misma manera. Gracias por corregirme. – jweyrich

11

Esto debería funcionar en Linux, Unix y OS X, para Windows necesita hacer una pequeña modificación.

#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

Necesita '#include '. – Ant

Cuestiones relacionadas