c++ cross-platform home-directory

¿Cómo puedo encontrar el directorio de inicio del usuario de forma multiplataforma, utilizando C++?



cross-platform home-directory (3)

El directorio de inicio no es realmente un concepto multiplataforma. Su sugerencia de la raíz del directorio del perfil (% USERPROFILE%) es una analogía justa, pero dependiendo de lo que quiera hacer una vez que tenga el directorio, es posible que desee uno de los directorios de Datos de la Aplicación o Mis Documentos del usuario. En UNIX, puede crear un ".myapp" oculto en el directorio de inicio para mantener sus archivos, pero eso no es correcto en Windows.

Lo mejor que puede hacer es escribir un código específico para cada plataforma, para llegar al directorio que desee en cada caso. Dependiendo de lo correcto que quiera ser, podría ser suficiente usar env vars: HOME en UNIX, USERPROFILE o APPDATA (dependiendo de lo que necesite) en Windows.

Al menos en UNIX (¿a alguien le interesa comentar a la gente de Windows?), Por lo general es una buena práctica usar la variable de entorno HOME si está configurada, incluso si no está de acuerdo con el directorio específico en el archivo de contraseña. Luego, en la extraña ocasión en que los usuarios desean que todas las aplicaciones lean sus datos de un directorio diferente, seguirá funcionando.

¿Cómo puedo encontrar el directorio de inicio del usuario de forma multiplataforma en C ++? es decir, / home / user en Linux, C: / Users / user / en Windows Vista, C: / Documents And Settings / user / en Windows XP, y lo que sea que utilicen las Mac. (Creo que es / Usuario / Usuario)

Básicamente, lo que busco es una forma en C ++ de hacer esto (ejemplo en python)

os.path.expanduser("~")


Esto es posible , y la mejor manera de encontrarlo es estudiar el código fuente de os.path.expanduser("~") , es realmente fácil replicar la misma funcionalidad en C.

Tendrá que agregar algunas directivas #ifdef para cubrir diferentes sistemas.

Aquí están las reglas que le proporcionarán el directorio HOME

  • Windows: env USERPROFILE o si esto falla, concatena HOMEDRIVE + HOMEPATH
  • Linux, Unix y OS X: env HOME o si esto falla, use getpwuid() ( código de ejemplo )

Observación importante: muchas personas están asumiendo que la variable de entorno HOME está siempre disponible en Unix pero esto no es cierto , un buen ejemplo sería OS X.

En OS X, cuando ejecute una aplicación desde GUI (no la consola), no tendrá esta variable configurada, por lo que necesita usar getpwuid ().


No creo que sea posible ocultar completamente la división de Windows / Unix con esta (a menos que, tal vez, Boost tenga algo).

La forma más portátil tendría que ser getenv("HOME") en Unix y concatenar los resultados de getenv("HOMEDRIVE") y getenv("HOMEPATH") en Windows.