2011-02-03 22 views
6

Voglio creare una directory path = "$HOME/somedir".Come creare una cartella nella home directory?

Ho provato con boost::filesystem::create_directory(path), ma viene a mancare - 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 porto la mia app a Windows nel prossimo futuro).

+2

si sta lavorando su Linux o Windows? – Nawaz

risposta

14

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.

4

Fuori della parte superiore della mia testa,

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

Vedere "nel mio caso il percorso della stringa è costante e non so con certezza se contiene una variabile". Inoltre, si potrebbe desidera controllare il valore di ritorno di getenv nel caso in cui la casa non è impostato - questo dovrebbe essere estremamente raro, ma sarebbe meglio interrompere o comunque terminare con un errore piuttosto che la testa in terra indefinito. –

Problemi correlati