Ottieni la directory corrente in C++

Jinku Hu 12 ottobre 2023
  1. Usa la funzione getcwd per ottenere la directory corrente
  2. Usa la funzione std::filesystem::current_path per ottenere la directory corrente
  3. Utilizzare la funzione get_current_dir_name per ottenere la directory corrente
Ottieni la directory corrente in C++

Questo articolo spiegherà diversi metodi su come ottenere la directory corrente in C++.

Usa la funzione getcwd per ottenere la directory corrente

Il getcwd è una funzione conforme a POSIX, disponibile su molti sistemi basati su Unix, e può recuperare la directory di lavoro corrente. La funzione accetta due parametri: il primo buffer char* in cui è memorizzato il percorso della directory e la dimensione del buffer. Si noti che stiamo dichiarando un array a lunghezza fissa char e allocare un buffer di 256 elementi, come esempio arbitrario. Se la chiamata ha successo, il nome memorizzato della directory corrente può essere stampato accedendo al buffer char.

#include <unistd.h>

#include <filesystem>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;

int main() {
  char tmp[256];
  getcwd(tmp, 256);
  cout << "Current working directory: " << tmp << endl;

  return EXIT_SUCCESS;
}

Produzione:

Current working directory: /tmp/projects

Usa la funzione std::filesystem::current_path per ottenere la directory corrente

Il metodo std::filesystem::current_path fa parte della libreria del filesystem C++ ed è il modo consigliato per recuperare la directory corrente dalle moderne linee guida di codifica. Notare che la libreria filesystem è stata aggiunta dopo la versione C++ 17 e la versione corrispondente del compilatore è richiesta per lavorare con il codice seguente.

std::filesystem::current_path senza alcun argomento restituisce la directory di lavoro corrente e può essere inviato direttamente alla console. Se il percorso della directory viene passato alla funzione, cambia la directory corrente nel percorso specificato.

#include <unistd.h>

#include <filesystem>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;

int main() {
  cout << "Current working directory: " << current_path() << endl;

  return EXIT_SUCCESS;
}

Produzione:

Current working directory: /tmp/projects

Utilizzare la funzione get_current_dir_name per ottenere la directory corrente

Il get_current_dir_name è la funzione della libreria C che è simile al metodo precedente tranne per il fatto che restituisce char* dove il percorso della directory di lavoro corrente è memorizzato dopo una chiamata riuscita. get_current_dir_name alloca automaticamente una quantità di memoria dinamica sufficiente per l’archiviazione del percorso, ma il chiamante è responsabile di liberare la memoria prima che il programma esca.

#include <unistd.h>

#include <filesystem>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;

int main() {
  char *cwd = get_current_dir_name();
  cout << "Current working directory: " << cwd << endl;
  free(cwd);

  return EXIT_SUCCESS;
}

Produzione:

Current working directory: /tmp/projects

Un’altra utile caratteristica della libreria del filesystem C++ è l’oggetto std::filesystem::directory_iterator, che può essere utilizzato per scorrere gli elementi in un dato percorso di directory. Nota che gli elementi possono essere file, collegamenti simbolici, directory o socket e il loro ordine di iterazione non è specificato. Nell’esempio seguente, restituiamo il percorso di ogni elemento nella directory di lavoro corrente.

#include <unistd.h>

#include <filesystem>
#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::current_path;
using std::filesystem::directory_iterator;

int main() {
  for (auto& p : directory_iterator("./")) cout << p.path() << '\n';

  return EXIT_SUCCESS;
}

Produzione:

"./main.cpp"
"./a.out"
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

Articolo correlato - C++ Filesystem