Per le macchine Linux o UNIX, il sistema operativo ha due funzioni che si occupano di nomi di percorso e di file. utilizzare man basename per ulteriori informazioni su queste funzioni. Il vantaggio di utilizzare la funzionalità fornita dal sistema è che non è necessario installare boost o la necessità di scrivere le proprie funzioni.
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
codice di esempio dalla pagina man:
char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);
causa del tipo di argomento non const della funzione basename(), è il codice un po 'non semplice utilizzando questo all'interno C++ . Ecco un semplice esempio dal mio codice base:
string getFileStem(const string& filePath) const {
char* buff = new char[filePath.size()+1];
strcpy(buff, filePath.c_str());
string tmp = string(basename(buff));
string::size_type i = tmp.rfind('.');
if (i != string::npos) {
tmp = tmp.substr(0,i);
}
delete[] buff;
return tmp;
}
L'uso di nuovo/eliminazione non è buono. Avrei potuto metterlo in un blocco try/catch nel caso in cui qualcosa fosse successo tra le due chiamate.
fonte
2017-04-07 22:19:58
concordato. Risponde alla domanda in modo sintetico. – AndyUK
In realtà, p.filename() è di tipo path e sarà racchiuso tra virgolette quando convertito in modo implicito, quindi otterrete: nome file ed estensione: "file.ext" Si può desiderare p.filename(). stringa() invece. –
Con C++ 14/C++ 17 puoi usare 'std :: experimental :: filesystem' risp' std :: filesystem'. Guarda il post di Yuchen Zhong in basso. –