Para las máquinas Linux o UNIX, el sistema operativo tiene dos funciones relacionadas con los nombres de ruta y de archivo. use man 3 basename para obtener más información sobre estas funciones. La ventaja de usar la funcionalidad proporcionada por el sistema es que no tiene que instalar el refuerzo o la necesidad de escribir sus propias funciones.
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
código Ejemplo de la página 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);
Debido al tipo de argumento no constante de la función basename(), es un poco no recto hacia adelante utilizando esta dentro de código C++ . Aquí hay un ejemplo simple de mi código 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;
}
El uso de nuevo/eliminar no es un buen estilo. Podría haberlo puesto en un bloque try/catch en caso de que algo ocurriera entre las dos llamadas.
De acuerdo. Responde la pregunta de manera más sucinta. – AndyUK
En realidad, p.filename() es de tipo ruta, y estará rodeado por comillas cuando se convierte implícitamente, por lo que obtendrá: nombre de archivo y extensión: "archivo.ext" Puede que desee p.filename(). cadena() en su lugar. –
Con C++ 14/C++ 17 puede usar 'std :: experimental :: filesystem' resp' std :: filesystem'. Ver la publicación de Yuchen Zhong a continuación. –