Ottieni la directory di lavoro corrente in C
-
Usa la funzione
getcwd
per ottenere la directory di lavoro corrente -
Verificare correttamente il valore restituito dalla funzione
getcwd
per ottenere la directory di lavoro corrente in C -
Utilizzare la funzione
get_current_dir_name
per ottenere la directory di lavoro corrente
Questo articolo spiegherà diversi metodi su come ottenere la directory di lavoro corrente in C.
Usa la funzione getcwd
per ottenere la directory di lavoro corrente
La funzione getcwd
è una chiamata di sistema conforme a POSIX che può recuperare la directory di lavoro corrente del programma chiamante. getcwd
accetta due argomenti: char*
buffer in cui è memorizzato il percorso e il numero di byte allocati nel buffer specificato. La funzione memorizza il nome della directory di lavoro corrente come una stringa con terminazione null e l’utente è responsabile di garantire che l’indirizzo char*
abbia spazio sufficiente per il percorso. Notare che getcwd
restituisce il percorso assoluto della directory.
#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);
}
Verificare correttamente il valore restituito dalla funzione getcwd
per ottenere la directory di lavoro corrente in C
La funzione getcwd
può non riuscire a recuperare il valore corretto; quindi, in questi casi, restituisce NULL
e imposta errno
con i codici di errore corrispondenti. L’utente è responsabile dell’implementazione del codice di controllo degli errori e della modifica del flusso di controllo del programma in base alle esigenze di un determinato scenario. Nota che impostiamo errno
esplicitamente a zero prima della chiamata alla funzione getcwd
poiché è buona pratica farlo prima di chiamare le funzioni di libreria che promettono di impostare errno
. errno
è impostato su ERANGE
se l’argomento size è minore del percorso della directory di lavoro.
#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);
}
In alternativa, possiamo passare il valore NULL
come primo argomento alla funzione getcwd
e 0
come secondo argomento. La funzione stessa allocherà dinamicamente un buffer abbastanza grande usando malloc
e restituirà il puntatore char
alla posizione. Si noti che l’utente dovrebbe chiamare la funzione free
sul puntatore restituito per deallocare la memoria 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);
}
Utilizzare la funzione get_current_dir_name
per ottenere la directory di lavoro corrente
get_current_dir_name
è un’altra funzione che può recuperare la directory di lavoro corrente. Notare che questa funzione richiede la definizione della macro _GNU_SOURCE
; al contrario, il codice genererà probabilmente un errore di compilazione. get_current_dir_name
non accetta argomenti e restituisce un puntatore a char
simile alla funzione getcwd
. La memoria viene allocata automaticamente usando malloc
e il codice del chiamante è responsabile della liberazione del puntatore restituito.
#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