Domanda

Voglio creare una directory path = "$HOME/somedir".

Ho provato a usare boost::filesystem::create_directory(path), ma fallisce - a quanto pare la funzione non espande le variabili di sistema.

Come posso farlo nel modo più semplice?

(Nota: nel mio caso la stringa path è costante e non so per certo se contiene una variabile)

EDIT: sto lavorando su Linux (anche se ho intenzione di portare la mia app su Windows nel prossimo futuro).

È stato utile?

Soluzione

Uso getenv per ottenere variabili di ambiente, incluso HOME. Se non sai con certezza se potrebbero essere presenti, dovrai analizzare la corda alla ricerca.

Puoi anche usare la shell del sistema ed eco per lasciare che la shell lo faccia per te.

Getenv è portatile (dallo standard C), ma usare la shell per farlo in portata sarà più difficile tra *Nix e Windows. La convenzione per le variabili di ambiente differisce anche tra *Nix e Windows, ma presumibilmente la stringa è un parametro di configurazione che può essere modificato per la piattaforma data.

Se devi solo supportare l'espansione delle directory domestiche piuttosto che le variabili di ambiente arbitrarie, è possibile utilizzare il ~ Convenzione e poi ~/somedir Per le stringhe di configurazione:

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

Questo comportamento viene copiato da Python OS.Path.Expanduser, tranne che gestisce solo l'utente attuale. Il tentativo di essere agnostici della piattaforma potrebbe essere migliorato controllando la piattaforma target piuttosto che provare ciecamente diverse variabili di ambiente, anche se USERPROFILE, HOMEDRIVE, e HOMEPATH è improbabile che sia impostato su Linux.

Altri suggerimenti

Dalla parte superiore della mia testa,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top