Obtenha o diretório de trabalho atual em C

Jinku Hu 12 outubro 2023
  1. Use a função getcwd para obter o diretório de trabalho atual
  2. Verifique corretamente o valor retornado da função getcwd para obter o diretório de trabalho atual em C
  3. Use a função get_current_dir_name para obter o diretório de trabalho atual
Obtenha o diretório de trabalho atual em C

Este artigo explicará vários métodos de como obter o diretório de trabalho atual em C.

Use a função getcwd para obter o diretório de trabalho atual

A função getcwd é uma chamada de sistema compatível com POSIX que pode recuperar o diretório de trabalho atual do programa de chamada. getcwd leva dois argumentos - buffer char* onde o nome do caminho é armazenado e o número de bytes alocados no buffer fornecido. A função armazena o nome do diretório de trabalho atual como uma string terminada em nulo e o usuário é responsável por garantir que o endereço char* tenha espaço suficiente para o nome do caminho. Observe que getcwd retorna o caminho absoluto do diretório.

#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);
}

Verifique corretamente o valor retornado da função getcwd para obter o diretório de trabalho atual em C

A função getcwd pode falhar ao recuperar o valor correto; portanto, em tais casos, ele retorna NULL e define errno com os códigos de erro correspondentes. O usuário é responsável por implementar o código de verificação de erros e modificar o fluxo de controle do programa conforme necessário para um determinado cenário. Observe que definimos errno explicitamente como zero antes da chamada da função getcwd, pois é uma prática recomendada fazer isso antes de chamar as funções da biblioteca que prometem definir errno. errno é definido como ERANGE se o argumento de tamanho for menor que o nome do caminho do diretório de trabalho.

#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 passar o valor NULL como o primeiro argumento para a função getcwd e 0 como o segundo argumento. A própria função alocará um buffer grande o suficiente dinamicamente usando malloc e retornará o ponteiro char para o local. Observe que o usuário deve chamar a função free no ponteiro retornado para desalocar a memória 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);
}

Use a função get_current_dir_name para obter o diretório de trabalho atual

get_current_dir_name é outra função que pode recuperar o diretório de trabalho atual. Observe que esta função requer que a macro _GNU_SOURCE seja definida; pelo contrário, o código provavelmente gerará um erro de compilação. get_current_dir_name não aceita argumentos e retorna o ponteiro char semelhante à função getcwd. A memória é alocada automaticamente usando malloc, e o código do chamador é responsável por liberar o ponteiro retornado.

#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