Obtener el directorio actual en C++

Jinku Hu 12 octubre 2023
  1. Usar la función getcwd para obtener el directorio actual
  2. Use la función std::filesystem::current_path para obtener el directorio actual
  3. Use la función get_current_dir_name para obtener el directorio actual
Obtener el directorio actual en C++

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"
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Filesystem