std::filesystem::remove, std::filesystem::remove_all
From cppreference.com
< cpp | filesystem
| ヘッダー <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以降) |
| std::uintmax_t remove_all( const std::filesystem::path& p, std::error_code& ec ); |
(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 削除 |
[編集] 関連項目
| ファイルを削除する (関数) |