Spec-Zone.ru › C++

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 удалён

См. также

remove
удаляет файл
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/remove

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API