Tengo un nombre de archivo (C: \ carpeta \ foo.txt) y necesito recuperar el nombre de la carpeta (C: \ carpeta) en C ++ no administrado. En C # haría algo como esto:
string folder = new FileInfo("C:\folder\foo.txt").DirectoryName;
¿Existe una función que se pueda usar en C ++ no administrado para extraer la ruta del nombre del archivo?
Usando Boost.Filesystem:
boost::filesystem::path p("C:\\folder\\foo.txt"); boost::filesystem::path dir = p.parent_path();
fuente
p.remove_filename()
se modificaráp
en el lugar y puede implementarse de manera más eficiente quep = p.parent_path()
parent_path()
de"C:\\folder"
resultará en"C:"
.Ejemplo de http://www.cplusplus.com/reference/string/string/find_last_of/
// string::find_last_of #include <iostream> #include <string> using namespace std; void SplitFilename (const string& str) { size_t found; cout << "Splitting: " << str << endl; found=str.find_last_of("/\\"); cout << " folder: " << str.substr(0,found) << endl; cout << " file: " << str.substr(found+1) << endl; } int main () { string str1 ("/usr/bin/man"); string str2 ("c:\\windows\\winhelp.exe"); SplitFilename (str1); SplitFilename (str2); return 0; }
fuente
En C ++ 17 existe una clase que
std::filesystem::path
usa el métodoparent_path
.#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { for(fs::path p : {"/var/tmp/example.txt", "/", "/var/tmp/."}) std::cout << "The parent path of " << p << " is " << p.parent_path() << '\n'; }
Salida posible:
The parent path of "/var/tmp/example.txt" is "/var/tmp" The parent path of "/" is "" The parent path of "/var/tmp/." is "/var/tmp"
fuente
.remove_filename()
método.¿Por qué tiene que ser tan complicado?
#include <windows.h> int main(int argc, char** argv) // argv[0] = C:\dev\test.exe { char *p = strrchr(argv[0], '\\'); if(p) p[0] = 0; printf(argv[0]); // argv[0] = C:\dev }
fuente
auto p = boost::filesystem::path("test/folder/file.txt"); std::cout << p.parent_path() << '\n'; // test/folder std::cout << p.parent_path().filename() << '\n'; // folder std::cout << p.filename() << '\n'; // file.txt
Es posible que deba
p.parent_path().filename()
obtener el nombre de la carpeta principal.fuente
Utilice boost :: filesystem. Se incorporará en el siguiente estándar de todos modos, por lo que es mejor que se acostumbre a él.
fuente
_splitpath es una buena solución CRT.
fuente
Estoy tan sorprendido de que nadie haya mencionado la forma estándar en Posix
Utilice
basename / dirname
construcciones.hombre nombre de base
fuente
basname(char * path)
y nobasename(const char * path)
), y las implementaciones que no lo hacen parecen tener que usar un búfer estático que los hace inseguros para subprocesos (en principio, usted también podría devolver resultados asignados dinámicamente, pero eso lo hace dependiente dealloc
funciones familiares, lo cual es incómodo en C ++).C ++ estándar no hará mucho por usted en este sentido, ya que los nombres de ruta son específicos de la plataforma. Puede analizar manualmente la cadena (como en la respuesta de glowcoder), usar las funciones del sistema operativo (por ejemplo, http://msdn.microsoft.com/en-us/library/aa364232(v=VS.85).aspx ), o probablemente el mejor enfoque, puede utilizar una biblioteca de sistema de archivos de terceros como boost :: filesystem.
fuente
Simplemente use esto: ExtractFilePath (your_path_file_name)
fuente