Obtener el directorio de trabajo actual en C

Jinku Hu 12 octubre 2023
  1. Usa la función getcwd para obtener el directorio de trabajo actual
  2. Verificar correctamente el valor devuelto por la función getcwd para obtener el directorio de trabajo actual en C
  3. Utilice la función get_current_dir_name para obtener el directorio de trabajo actual
Obtener el directorio de trabajo actual en C

Este artículo explicará varios métodos para obtener el directorio de trabajo actual en C.

Usa la función getcwd para obtener el directorio de trabajo actual

La función getcwd es una llamada al sistema compatible con POSIX que puede recuperar el directorio de trabajo actual del programa que llama. La función getcwd toma dos argumentos - el buffer char* donde se almacena el nombre de la ruta y el número de bytes asignados en el buffer dado. La función almacena el nombre del directorio de trabajo actual como una cadena terminada en cero y el usuario es responsable de garantizar que la dirección char* tiene suficiente espacio para el nombre de la ruta. Tenga en cuenta que getcwd devuelve el nombre absoluto del directorio.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  getcwd(path, MAX_BUF);
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

Verificar correctamente el valor devuelto por la función getcwd para obtener el directorio de trabajo actual en C

La función getcwd puede fallar al recuperar el valor correcto; por lo tanto, en tales casos, devuelve NULL y establece errno con los códigos de error correspondientes. El usuario es responsable de implementar el código de comprobación de errores y de modificar el flujo de control del programa según sea necesario para un escenario determinado. Tenga en cuenta que ponemos errno explícitamente a cero antes de la llamada a la función getcwd ya que es una buena práctica hacerlo antes de llamar a las funciones de la biblioteca que prometen poner errno. El valor de errno se pone a cero si el argumento tamaño es menor que el nombre de la ruta del directorio de trabajo.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  if (getcwd(path, MAX_BUF) == NULL) {
    if (errno == ERANGE)
      printf("[ERROR] pathname length exceeds the buffer size\n");
    else
      perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", path);

  exit(EXIT_SUCCESS);
}

Alternativamente, podemos pasar el valor NULL como primer argumento a la función getcwd y 0 como segundo argumento. La propia función asignará un buffer suficientemente grande de forma dinámica utilizando malloc y devolverá el puntero char a la ubicación. Ten en cuenta que el usuario debe llamar a la función free sobre el puntero devuelto para desasignar la memoria del buffer.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = getcwd(NULL, 0);
  if (buf == NULL) {
    perror("getcwd");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}

Utilice la función get_current_dir_name para obtener el directorio de trabajo actual

La función get_current_dir_name es otra función que puede recuperar el directorio de trabajo actual. Tenga en cuenta que esta función requiere que la macro _GNU_SOURCE esté definida; de lo contrario, el código probablemente arrojará un error de compilación. La función get_current_dir_name no toma argumentos y devuelve un puntero char similar a la función getcwd. La memoria se asigna automáticamente usando malloc, y el código que llama es responsable de liberar el puntero devuelto.

#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#ifndef MAX_BUF
#define MAX_BUF 200
#endif

int main(void) {
  char path[MAX_BUF];

  errno = 0;
  char *buf = get_current_dir_name();
  if (buf == NULL) {
    perror("get_current_dir_name");
    exit(EXIT_FAILURE);
  }
  printf("Current working directory: %s\n", buf);
  free(buf);

  exit(EXIT_SUCCESS);
}
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