Obtenha o diretório de trabalho atual em C
- 
          
            Use a função getcwdpara obter o diretório de trabalho atual
- 
          
            Verifique corretamente o valor retornado da função getcwdpara obter o diretório de trabalho atual em C
- 
          
            Use a função get_current_dir_namepara obter o diretório de trabalho atual
 
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);
}
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