Ottieni la directory di lavoro corrente in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione getcwd per ottenere la directory di lavoro corrente
  2. Verificare correttamente il valore restituito dalla funzione getcwd per ottenere la directory di lavoro corrente in C
  3. Utilizzare la funzione get_current_dir_name per ottenere la directory di lavoro corrente
Ottieni la directory di lavoro corrente in C

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);
}
Autore: 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