std::filesystem::remove, std::filesystem::remove_all
Определено в заголовочном файле <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 (если это каталог) и содержимое всех его подкаталогов рекурсивно, а затем удаляет сам p так же, как при многократном применении POSIX-функции remove. Символические ссылки не разыменовываются (удаляется сама символическая ссылка, а не её цель).Параметры
| p | - | путь для удаления |
| ec | - | выходной параметр для передачи сведений об ошибке в перегрузке, не генерирующей исключения. |
Возвращаемое значение
1,2)
true, если файл был удалён, и false, если он не существовал. Перегрузка, принимающая аргумент error_code&, при ошибке возвращает false.
3,4) Возвращает количество удалённых файлов и каталогов (оно может быть равно нулю, если
p изначально не существовал). Перегрузка, принимающая аргумент error_code&, при ошибке возвращает static_cast<std::uintmax_t>(-1).Исключения
Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc при сбое выделения памяти.
1,3) При ошибках нижележащего API операционной системы выбрасывает
std::filesystem::filesystem_error, конструируемое с p в качестве первого аргумента-пути и с кодом ошибки ОС в качестве аргумента кода ошибки.
2,4) При сбое вызова 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 удалён |
См. также
| удаляет файл (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/remove