Obtenha o diretório de trabalho atual em C
-
Use a função
getcwd
para obter o diretório de trabalho atual -
Verifique corretamente o valor retornado da função
getcwd
para obter o diretório de trabalho atual em C -
Use a função
get_current_dir_name
para 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