Obtener el directorio actual en C++
-
Usar la función
getcwd
para obtener el directorio actual -
Use la función
std::filesystem::current_path
para obtener el directorio actual -
Use la función
get_current_dir_name
para obtener el directorio actual
Este artículo explicará varios métodos de cómo obtener el directorio actual en C++.
Usar la función getcwd
para obtener el directorio actual
El getcwd
es una función compatible con POSIX, disponible en muchos sistemas basados en Unix, y puede recuperar el directorio de trabajo actual. La función toma dos parámetros - el primer búfer char*
donde se almacena la ruta del directorio y el tamaño del búfer. Observe que estamos declarando char
un array de longitud fija y asignamos un búfer de 256 elementos, como un ejemplo arbitrario. Si la llamada tiene éxito, el nombre almacenado del directorio actual puede ser impreso accediendo al buffer char
.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char tmp[256];
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;
return EXIT_SUCCESS;
}
Producción :
Current working directory: /tmp/projects
Use la función std::filesystem::current_path
para obtener el directorio actual
El método std::filesystem::current_path
es parte de la biblioteca del sistema de archivos de C++ y es la forma recomendada de recuperar el directorio actual por las pautas de codificación modernas. Nótese que la librería filesystem
fue añadida después de la versión de C++17 y la versión correspondiente del compilador es necesaria para trabajar con el siguiente código.
std::filesystem::current_path
sin ningún argumento devuelve el directorio de trabajo actual y puede ser directamente enviado a la consola. Si se pasa la ruta del directorio a la función, cambia el directorio actual a la ruta dada.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
cout << "Current working directory: " << current_path() << endl;
return EXIT_SUCCESS;
}
Producción :
Current working directory: /tmp/projects
Use la función get_current_dir_name
para obtener el directorio actual
El get_current_dir_name
es la función de la biblioteca C que es similar al método anterior excepto que devuelve char*
donde se almacena la ruta del directorio de trabajo actual después de una llamada exitosa. get_current_dir_name
asigna automáticamente suficiente memoria dinámica para que se almacene la ruta, pero el llamador es responsable de liberar la memoria antes de que el programa salga.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
int main() {
char *cwd = get_current_dir_name();
cout << "Current working directory: " << cwd << endl;
free(cwd);
return EXIT_SUCCESS;
}
Producción :
Current working directory: /tmp/projects
Otra característica útil de la biblioteca del sistema de archivos de C++ es el objeto std::filesystem::directory_iterator
, que puede ser utilizado para iterar a través de los elementos en una ruta de directorio dada. Nótese que los elementos pueden ser archivos, enlaces simbólicos, directorios o sockets, y su orden de iteración no está especificado. En el siguiente ejemplo, obtenemos la ruta de cada elemento en el directorio de trabajo actual.
#include <unistd.h>
#include <filesystem>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
using std::filesystem::directory_iterator;
int main() {
for (auto& p : directory_iterator("./")) cout << p.path() << '\n';
return EXIT_SUCCESS;
}
Producción :
"./main.cpp"
"./a.out"
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook