名前空間
変種
操作

std::filesystem::remove, std::filesystem::remove_all

From cppreference.com
 
 
 
ヘッダー <filesystem> で定義
bool remove( const std::filesystem::path& p );
(1) (C++17以降)
bool remove( const std::filesystem::path& p, std::error_code& ec ) noexcept;
(2) (C++17以降)
std::uintmax_t remove_all( const std::filesystem::path& p );
(3) (C++17以降)
(4) (C++17以降)
1,2) パス `p` で識別されるファイルまたは空のディレクトリが、POSIX の `remove` と同様に削除されます。シンボリックリンクはたどりません(シンボリックリンク自体が削除され、そのターゲットは削除されません)。
3,4) `p` がディレクトリの場合、その内容と、すべてのサブディレクトリの内容を再帰的に削除してから、POSIX の `remove` を繰り返し適用するのと同じように `p` 自体を削除します。シンボリックリンクはたどりません(シンボリックリンク自体が削除され、そのターゲットは削除されません)。

目次

[編集] パラメータ

p - 削除するパス
エラーコード - 例外を投げないオーバーロードでのエラー報告用アウトパラメータ。

[編集] 戻り値

1,2) ファイルが削除された場合は `true`、存在しなかった場合は `false`。 `error_code&` 引数を受け取るオーバーロードは、エラー時に `false` を返します。
3,4) 削除されたファイルおよびディレクトリの数を返します(`p` が最初から存在しなかった場合はゼロになることもあります)。 `error_code&` 引数を受け取るオーバーロードは、エラー時に `static_cast(-1)` を返します。

[編集] 例外

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

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

[編集] 注記

POSIX システムでは、この関数は通常、必要に応じて `unlink` および `rmdir` を呼び出します。Windows では `DeleteFileW` および `RemoveDirectoryW` を呼び出します。

`p` が存在しなかった場合、この関数は `false` を返し、エラーを報告しません。

[編集]

#include <cstdint>
#include <filesystem>
#include <fstream>
#include <iostream>
 
int main()
{
    namespace fs = std::filesystem;
    std::cout << std::boolalpha;
 
    fs::path tmp{std::filesystem::temp_directory_path()};
 
    const auto O_O{"O_O"};
    std::ofstream{tmp / O_O} << O_O; // creates file containing O_O
    std::cout << "remove(): " << fs::remove(tmp / O_O) << '\n'; // success
    std::cout << "remove(): " << fs::remove(tmp / O_O) << '\n'; // fail
 
    std::filesystem::create_directories(tmp / "abcdef/example");
    const std::uintmax_t n{fs::remove_all(tmp / "abcdef")};
    std::cout << "remove_all(): " << n << " files or directories\n";
}

実行結果の例

remove(): true
remove(): false
remove_all(): 2 files or directories

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3014 C++17 `error_code` オーバーロードの `remove_all` は `noexcept` とマークされていますが、メモリを割り当てる可能性があります。 noexcept 削除

[編集] 関連項目

ファイルを削除する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)