名前空間
変種
操作

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

From cppreference.com
 
 
 
ヘッダー <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 - 作成する新しいディレクトリへのパス
既存のパス - 属性をコピーするディレクトリへのパス
エラーコード - 例外を投げないオーバーロードでのエラー報告のための出力パラメータ

[編集] 戻り値

ディレクトリ p が解決するディレクトリのために新しくディレクトリが作成された場合は true、それ以外の場合は 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、2番目のパス引数として existing_p、エラーコード引数として 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());
 
    // Basic usage
    std::filesystem::create_directories("sandbox/1/2/a");
    std::filesystem::create_directory("sandbox/1/2/b");
 
    // Directory already exists (false returned, no error)
    assert(!std::filesystem::create_directory("sandbox/1/2/b"));
 
    // Permissions copying usage
    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 create_directorieserror_code オーバーロードは noexcept とマークされているが、メモリを割り当てることが可能 noexcept 削除
P1164R1 C++17 既存の非ディレクトリファイルによって引き起こされる作成の失敗はエラーではない エラーに変更

[編集] 関連項目

シンボリックリンクを作成する
(関数) [編集]
(C++17)
ファイルまたはディレクトリをコピーする
(関数) [編集]
(C++17)
ファイルシステムのパーミッションを識別する
(列挙型) [編集]
English 日本語 中文(简体) 中文(繁體)