Question

Je veux créer un répertoire path = "$HOME/somedir".

J'ai essayé d'utiliser boost::filesystem::create_directory(path), mais il échoue - apparemment, la fonction n'élargit pas les variables système.

Comment puis-je le faire de la manière la plus simple?

(Remarque: Dans mon cas, la chaîne path est constant et je ne sais pas avec certitude s'il contient une variable)

Edit: je travaille sur Linux (bien que je prévois de porter mon application vers Windows dans un avenir proche).

Était-ce utile?

La solution

Utilisation GETENV pour obtenir des variables d'environnement, y compris HOME. Si vous ne savez pas avec certitude s'ils pourraient être présents, vous devrez analyser la chaîne à la recherche.

Vous pouvez également utiliser le shell système et l'écho pour laisser le shell le faire pour vous.

GETENV est portable (à partir de la norme C), mais l'utilisation du shell pour le faire portable sera plus difficile entre * Nix et Windows. La convention pour les variables d'environnement diffère également entre * Nix et Windows, mais vraisemblablement, la chaîne est un paramètre de configuration qui peut être modifié pour la plate-forme donnée.

Si vous n'avez besoin que de soutenir l'expansion des répertoires domestiques plutôt que des variables d'environnement arbitraires, vous pouvez utiliser le ~ convention et puis ~/somedir pour vos chaînes de configuration:

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;
}

Ce comportement est copié à partir de Python os.path.expanduser, sauf qu'il gère uniquement l'utilisateur actuel. La tentative d'agnostique de la plate-forme pourrait être améliorée en vérifiant la plate-forme cible plutôt qu'en essayant aveuglément différentes variables d'environnement, même si USERPROFILE, HOMEDRIVE, et HOMEPATH

Autres conseils

Du haut de ma tête,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top