Pregunta

Quiero crear un directorio path = "$HOME/somedir".

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 manera más sencilla?

(Nota: en mi caso la cadena path es constante y no sé con certeza si contiene una variable)

EDITAR: Estoy trabajando en Linux (aunque planeo portar mi aplicación a Windows en el futuro cercano).

¿Fue útil?

Solución

Usar getenv para obtener variables de entorno, incluida HOME. Si no sabe con certeza si podrían estar presentes, tendrá que analizar la cadena buscandolos.

También puede usar el shell del sistema y hacer eco para dejar que el shell haga esto por usted.

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

Si solo necesita apoyar la expansión de los directorios del hogar en lugar de las variables de entorno arbitrarias, puede usar el ~ 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's OS.PATH.EXPANDUSER, excepto que solo maneja al usuario actual. El intento de ser la plataforma agnóstica podría mejorarse verificando la plataforma objetivo en lugar de probar ciegamente diferentes variables de entorno, aunque USERPROFILE, HOMEDRIVE, y HOMEPATH Es poco probable que se establezca en Linux.

Otros consejos

La parte superior de mi cabeza,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top