2012-04-28 12 views

risposta

30

Il modo più semplice è quello di utilizzare find_last_of funzione di membro della std::string

string s1("../somepath/somemorepath/somefile.ext"); 
string s2("..\\somepath\\somemorepath\\somefile.ext"); 
cout << s1.substr(0, s1.find_last_of("\\/")) << endl; 
cout << s2.substr(0, s2.find_last_of("\\/")) << endl; 

Questa soluzione funziona con entrambe le barre avanti e indietro.

+3

Funziona partendo dal presupposto che l'utente non inserisca mai alcuna barra nei suoi nomi file. – Potatoswatter

+0

funziona per me :) grazie! – Mat

+0

Non ha funzionato per me, ma questo ha http://stackoverflow.com/questions/8518743/get-directory-from-file-path-c – brad

4

utilizzare strrchr() per trovare l'ultima barra rovesciata e rimuovere la stringa.

char *pos = strrchr(pathname, '\\'); 
if (pos != NULL) { 
    *pos = '\0'; //this will put the null terminator here. you can also copy to another string if you want 
} 
+2

E se invece fosse una barra ('/')? – Cameron

5

In Windows 8, utilizzare PathCchRemoveFileSpec che si trova in Pathcch.h

PathCchRemoveFileSpec rimuoverà l'ultimo elemento in un percorso, quindi se si passa un percorso di directory, l'ultima cartella sarà spogliato.
Se vuoi evitare questo, e non siete sicuri se un percorso di file è una directory, utilizzare PathIsDirectory

PathCchRemoveFileSpec non si comporta come previsto su percorsi contenenti avanti barre.

+1

Solo su Windows 8 – Liviu

Problemi correlati