Crea directory in C++

Jinku Hu 12 ottobre 2023
  1. Usa la funzione std::filesystem::create_directory per creare una directory in C++
  2. Usa la funzione std::filesystem::create_directories per creare una directory in C++
Crea directory in C++

Questo articolo spiegherà diversi metodi su come creare una directory in C++.

Usa la funzione std::filesystem::create_directory per creare una directory in C++

Dalla versione C++ 17, la libreria standard fornisce l’interfaccia di manipolazione del filesystem originariamente implementata come parte della libreria Boost. Notare che tutte le funzionalità del filesystem sono fornite sotto lo spazio dei nomi std::filesystem, che chiameremo fs negli esempi seguenti. La funzione create_directory viene utilizzata per creare una nuova directory nella directory di lavoro corrente. La funzione accetta un argomento obbligatorio di tipo std::filesystem::path, che può anche essere passato come oggetto stringa, e la corretta inizializzazione viene eseguita automaticamente.

#include <filesystem>
#include <iostream>

using std::cout;
using std::endl;
using std::string;
using std::system;
namespace fs = std::filesystem;

int main() {
  string directory_name("tmp_dir");

  fs::create_directory(directory_name)
      ? cout << "created directory - " << directory_name << endl
      : cout << "create_directory() failed" << endl;

  return EXIT_SUCCESS;
}

La chiamata di funzione riuscita può essere verificata dal valore di ritorno di create_directory, che dovrebbe essere valutato come true. Notare che la directory creata può essere rimossa con la chiamata std::filesystem::remove, che accetta lo stesso percorso della directory. Opzionalmente create_directory può accettare argomenti a due percorsi, il secondo dei quali deve essere una directory esistente e una directory appena creata copierà gli attributi della prima.

#include <filesystem>
#include <iostream>

using std::cout;
using std::endl;
using std::string;
using std::system;
namespace fs = std::filesystem;

int main() {
  string directory_name("tmp_dir");

  fs::create_directory(directory_name)
      ? cout << "created directory - " << directory_name << endl
      : cout << "create_directory() failed" << endl;

  fs::remove(directory_name);

  return EXIT_SUCCESS;
}

Usa la funzione std::filesystem::create_directories per creare una directory in C++

Un’altra funzione utile è std::filesystem::create_directories, che può creare più directory annidate, tutte specificate con un unico argomento di percorso. Nel seguente codice di esempio, dimostriamo questa funzione per creare directory nidificate a 4 livelli e poi un’altra che condivide la directory principale con la prima. Nota però, se i nomi di directory dell’ultimo livello esistono già, la funzione restituisce false.

#include <filesystem>
#include <iostream>

using std::cout;
using std::endl;
using std::string;
using std::system;
namespace fs = std::filesystem;

int main() {
  string directory_tree = "x_tmp/level1/level2/level3";
  string directory_tree2 = "x_tmp/level1-2/level2-1";

  auto ret = fs::create_directories(directory_tree);
  if (ret) {
    cout << "created directory tree as follows: " << endl;
    std::system("tree x_tmp");
  } else {
    cout << "create_directories() failed" << endl;
  }

  auto ret2 = fs::create_directories(directory_tree2);
  if (ret2) {
    cout << "created directory tree as follows: " << endl;
    std::system("tree x_tmp");
  } else {
    cout << "create_directories() failed" << endl;
  }

  return EXIT_SUCCESS;
}

Simile a create_directory, questa funzione restituisce anche un valore booleano per denotare una chiamata riuscita. Nel caso in cui sia richiesta la rimozione, la funzione std::filesystem::remove_all può essere invocata con il nome della directory root, cancellerà l’intero albero.

#include <filesystem>
#include <iostream>

using std::cout;
using std::endl;
using std::string;
using std::system;
namespace fs = std::filesystem;

int main() {
  string directory_tree = "x_tmp/level1/level2/level3";
  string directory_tree2 = "x_tmp/level1-2/level2-1";

  auto ret = fs::create_directories(directory_tree);
  if (ret) {
    cout << "created directory tree as follows: " << endl;
    std::system("tree x_tmp");
  } else {
    cout << "create_directories() failed" << endl;
  }

  auto ret2 = fs::create_directories(directory_tree2);
  if (ret2) {
    cout << "created directory tree as follows: " << endl;
    std::system("tree x_tmp");
  } else {
    cout << "create_directories() failed" << endl;
  }

  fs::remove_all(directory_tree.substr(0, directory_tree.find('/')));

  return 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

Articolo correlato - C++ Filesystem