2011-02-03 19 views
6

Quiero crear un directorio path = "$HOME/somedir".¿Cómo crear una carpeta en el directorio de inicio?

He intentado usar boost::filesystem::create_directory(path), pero falla - aparentemente la función no expande las variables del sistema.

¿Cómo puedo hacerlo de la forma más sencilla?

(nota: en mi caso la cadena path es constante y no sé a ciencia cierta si contiene una variable)

editar: Estoy trabajando en Linux (aunque yo estoy planeando mi puerto aplicación para Windows en el futuro cercano).

+2

Estás trabajando en Linux o Windows? – Nawaz

Respuesta

14

Utilice getenv para obtener variables de entorno, incluyendo HOME. Si no está seguro de si podrían estar presentes, tendrá que analizar la cadena buscándolos.

También podría usar el shell y el eco del sistema para dejar que el shell lo haga por usted.

Getenv es portátil (a partir del estándar C), pero usar el shell para hacer esto de forma portátil será más difícil entre * nix y Windows. La convención para variables de entorno difiere entre * nix y Windows también, pero presumiblemente la cadena es un parámetro de configuración que puede modificarse para la plataforma dada.

Si sólo necesita para apoyar la expansión de los directorios de inicio en lugar de variables de entorno arbitrarias, puede utilizar la convención ~ y luego ~/somedir para sus cadenas de configuración:

std::string expand_user(std::string path) { 
    if (not path.empty() and path[0] == '~') { 
    assert(path.size() == 1 or path[1] == '/'); // or other error handling 
    char const* home = getenv("HOME"); 
    if (home or ((home = getenv("USERPROFILE")))) { 
     path.replace(0, 1, home); 
    } 
    else { 
     char const *hdrive = getenv("HOMEDRIVE"), 
     *hpath = getenv("HOMEPATH"); 
     assert(hdrive); // or other error handling 
     assert(hpath); 
     path.replace(0, 1, std::string(hdrive) + hpath); 
    } 
    } 
    return path; 
} 

Este comportamiento se copia de Python de os.path.expanduser, excepto que solo maneja el usuario actual. El intento de ser independiente de la plataforma podría mejorarse verificando la plataforma de destino en lugar de intentar ciegamente diferentes variables de entorno, aunque USERPROFILE, HOMEDRIVE y HOMEPATH es poco probable que se configuren en Linux.

4

De la parte superior de mi cabeza,

namespace fs = boost::filesystem; 
fs::create_directory(fs::path(getenv("HOME"))); 
+1

Ver "en mi caso, la ruta de la cadena de caracteres es constante y no estoy seguro si contiene una variable". Además, es posible que desee comprobar el valor de retorno de getenv en caso de que HOME no esté configurado; esto debería ser extremadamente raro, pero sería mejor abortar o terminar de otra manera con un error en lugar de dirigirse a un territorio no definido. –

Cuestiones relacionadas