Utilizzare getenv per ottenere variabili di ambiente, tra cui HOME
. Se non sai con certezza se potrebbero essere presenti, dovrai analizzare la stringa cercandoli.
È anche possibile utilizzare la shell di sistema e l'eco di lasciare che il guscio di fare questo per voi.
getenv è portatile (da serie C), ma utilizzando la shell per fare questo portabile sarà più difficile tra * nix e Windows. Anche la convenzione per le variabili di ambiente differisce tra * nix e Windows, ma presumibilmente la stringa è un parametro di configurazione che può essere modificato per la piattaforma specificata.
Se avete solo bisogno di supportare l'espansione home directory, piuttosto che le variabili di ambiente arbitrari, è possibile utilizzare la 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 è copiato da Python di os.path.expanduser, tranne che gestisce solo l'utente corrente. Il tentativo di essere indipendente dalla piattaforma potrebbe essere migliorato controllando la piattaforma di destinazione anziché tentare ciecamente di variabili di ambiente diverse, anche se è improbabile che Linux sia impostato su USERPROFILE
, HOMEDRIVE
e HOMEPATH
.
fonte
2011-02-03 20:09:15
si sta lavorando su Linux o Windows? – Nawaz