Ottieni la directory di lavoro corrente in C

Jinku Hu 12 ottobre 2023 C C Directory
  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);
}
Ti piacciono i nostri tutorial? Iscriviti a DelftStack su YouTube per aiutarci a creare altre guide video di alta qualità. Iscriviti
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