C++ でディレクトリを作成する

胡金庫 2023年10月12日
  1. C++ で std::filesystem::create_directory 関数を使用してディレクトリを作成する
  2. C++ で std::filesystem::create_directories 関数を使用してディレクトリを作成する
C++ でディレクトリを作成する

この記事では、C++ でディレクトリを作成する方法のいくつかの方法について説明します。

C++ で std::filesystem::create_directory 関数を使用してディレクトリを作成する

C++ 17 バージョン以降、標準ライブラリは、Boost ライブラリの一部として最初に実装されたファイルシステム操作インターフェイスを提供します。すべてのファイルシステム機能は、std::filesystem 名前空間で提供されていることに注意してください。これは、次の例では fs としてエイリアスされています。create_directory 関数は、現在の作業ディレクトリに新しいディレクトリを作成するために使用されます。この関数は、タイプ std::filesystem::path の必須引数を 1つ取ります。これは、文字列オブジェクトとして渡すこともでき、適切な初期化が自動的に行われます。

#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;
}

成功した関数呼び出しは、create_directory の戻り値で確認できます。戻り値は true と評価されます。作成されたディレクトリは、同じディレクトリパスを使用する std::filesystem::remove 呼び出しで削除できることに注意してください。create_directory はオプションで 2つのパスの引数を取ることができます。2 番目の引数は既存のディレクトリである必要があり、新しく作成されたディレクトリは前のディレクトリの属性をコピーします。

#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;
}

C++ で std::filesystem::create_directories 関数を使用してディレクトリを作成する

もう 1つの便利な関数は std::filesystem::create_directories です。これは、すべて単一のパス引数で指定された複数のネストされたディレクトリを作成できます。次のサンプルコードでは、この関数を使用して 4 レベルのネストされたディレクトリを作成し、次にルートディレクトリを最初のディレクトリと共有する別のディレクトリを作成します。ただし、最後のレベルのディレクトリ名がすでに存在する場合、関数は 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;
}

create_directory と同様に、この関数も呼び出しが成功したことを示すブール値を返します。削除が必要な場合は、std::filesystem::remove_all 関数をルートディレクトリ名で呼び出すことができ、ツリー全体が削除されます。

#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;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Filesystem