Namespaces
Variants

std::filesystem:: create_directory, std::filesystem:: create_directories

From cppreference.net
ヘッダーで定義 <filesystem>
bool create_directory ( const std:: filesystem :: path & p ) ;
(1) (C++17以降)
bool create_directory ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(2) (C++17以降)
bool create_directory ( const std:: filesystem :: path & p,
const std:: filesystem :: path & existing_p ) ;
(3) (C++17以降)
bool create_directory ( const std:: filesystem :: path & p,

const std:: filesystem :: path & existing_p,

std:: error_code & ec ) noexcept ;
(4) (C++17以降)
bool create_directories ( const std:: filesystem :: path & p ) ;
(5) (C++17以降)
bool create_directories ( const std:: filesystem :: path & p, std:: error_code & ec ) ;
(6) (C++17以降)
1,2) ディレクトリ p をPOSIXの mkdir() を使用して、第2引数に static_cast < int > ( std:: filesystem :: perms :: all ) を指定したかのように作成する(親ディレクトリは既に存在している必要がある)。 p が既存のディレクトリを指しているために関数が失敗した場合、エラーは報告されない。それ以外の失敗の場合にはエラーが報告される。
3,4) (1,2) と同様であるが、新しいディレクトリの属性が existing_p (既存のディレクトリでなければならない)からコピーされる点が異なる。どの属性がコピーされるかはOSに依存する:POSIXシステムでは、以下のようにして属性がコピーされる:
stat(existing_p.c_str(), &attributes_stat)
mkdir(p.c_str(), attributes_stat.st_mode)
Windows OSでは、 existing_p の属性は一切コピーされない。
5,6) 既に存在しない p の各要素に対して (1,2) を実行します。 p が既に存在する場合、関数は何も行いません(この条件はエラーとして扱われません)。

目次

パラメータ

p - 作成する新しいディレクトリへのパス
existing_p - 属性をコピーする元ディレクトリへのパス
ec - 例外を投げないオーバーロードでのエラー報告用出力パラメータ

戻り値

true ディレクトリ p が解決する先のディレクトリが新しく作成された場合、 false それ以外の場合。

例外

noexcept でマークされていないオーバーロードは、 メモリ確保に失敗した場合 std::bad_alloc をスローする可能性があります。

1,5) 基盤となるOS APIエラーが発生した場合、 std::filesystem::filesystem_error をスローします。これは p を最初のパス引数、OSエラーコードをエラーコード引数として構築されます。
2,6) OS API呼び出しが失敗した場合、 std:: error_code & パラメータをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。
3) 基盤となるOS APIエラーが発生した場合 std::filesystem::filesystem_error をスローします。この例外は p を第1パス引数、 existing_p を第2パス引数、OSエラーコードをエラーコード引数として構築されます。
4) OS API呼び出しが失敗した場合、 std:: error_code & パラメータをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。

注記

属性保持オーバーロード (3,4) は、 copy() がディレクトリを再帰的にコピーする際に暗黙的に呼び出されます。boost.filesystemにおける同等の機能は copy_directory (引数の順序が逆になっています)です。

#include <cassert>
#include <cstdlib>
#include <filesystem>
int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());
    // 基本的な使用法
    std::filesystem::create_directories("sandbox/1/2/a");
    std::filesystem::create_directory("sandbox/1/2/b");
    // ディレクトリは既に存在する(falseが返され、エラーは発生しない)
    assert(!std::filesystem::create_directory("sandbox/1/2/b"));
    // パーミッションのコピー使用法
    std::filesystem::permissions(
        "sandbox/1/2/b",
        std::filesystem::perms::others_all,
        std::filesystem::perm_options::remove
    );
    std::filesystem::create_directory("sandbox/1/2/c", "sandbox/1/2/b");
    std::system("ls -l sandbox/1/2");
    std::system("tree sandbox");
    std::filesystem::remove_all("sandbox");
}

出力例:

drwxr-xr-x 2 user group 4096 Apr 15 09:33 a
drwxr-x--- 2 user group 4096 Apr 15 09:33 b
drwxr-x--- 2 user group 4096 Apr 15 09:33 c
sandbox
└── 1
    └── 2
        ├── a
        ├── b
        └── c

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2935 C++17 ターゲットが既に存在するがディレクトリでない場合にエラー エラーではない
LWG 3014 C++17 error_code オーバーロードの create_directories がnoexceptだがメモリを確保可能 noexceptを削除
P1164R1 C++17 既存の非ディレクトリファイルによる作成失敗はエラーではない エラーに変更

関連項目

シンボリックリンクを作成する
(関数)
(C++17)
ファイルまたはディレクトリをコピーする
(関数)
(C++17)
ファイルシステムのパーミッションを識別する
(列挙型)