Spec-Zone.ru › C++

std::filesystem::exists

Определено в заголовочном файле <filesystem>
bool exists( std::filesystem::file_status s ) noexcept;
(1) (начиная с C++17)
bool exists( const std::filesystem::path& p );
(2) (начиная с C++17)
bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept;
(3) (начиная с C++17)

Проверяет, соответствует ли заданный статус файла или путь существующему файлу или каталогу.

1) Эквивалентно status_known(s) && s.type() != file_type::not_found.
2,3) Пусть s — это std::filesystem::file_status, определённый так, как если бы была вызвана функция status(p) или status(p, ec) (символические ссылки разыменовываются) соответственно. Возвращает exists(s). Перегрузка, не генерирующая исключений, вызывает ec.clear(), если status_known(s).

Параметры

s - статус файла для проверки
p - путь для проверки
ec - выходной параметр для сообщения об ошибке в перегрузке, не генерирующей исключений

Возвращаемое значение

true, если заданный путь или статус файла соответствует существующему файлу или каталогу, и false в противном случае.

Исключения

Любая перегрузка, не помеченная как noexcept, может выбросить std::bad_alloc в случае сбоя выделения памяти.

2) Выбрасывает std::filesystem::filesystem_error при ошибках базового API операционной системы; исключение создаётся с p в качестве первого аргумента пути и с кодом ошибки ОС в качестве аргумента кода ошибки.
3) При сбое вызова API операционной системы устанавливает в параметр std::error_code& код ошибки ОС, а при отсутствии ошибок выполняет ec.clear().

Если объект не существует, исключение файловой системы не выбрасывается (используйте возвращаемое значение).

Примечания

Информация, предоставляемая этой функцией, обычно также получается в процессе обхода каталога. При обходе каталога вызов exists(*iterator) менее эффективен, чем exists(iterator->status()).

Пример

#include <cstdint>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;

void demo_exists(const fs::path& p, fs::file_status s = fs::file_status{})
{
    std::cout << p;
    if (fs::status_known(s) ? fs::exists(s) : fs::exists(p))
        std::cout << " exists\n";
    else
        std::cout << " does not exist\n";
}

int main()
{
    const fs::path sandbox{"sandbox"};
    fs::create_directory(sandbox);
    std::ofstream{sandbox/"file"}; // create regular file
    fs::create_symlink("non-existing", sandbox/"symlink");

    demo_exists(sandbox);

    for (const auto& entry : fs::directory_iterator(sandbox))
        demo_exists(entry, entry.status()); // use cached status from directory entry

    fs::remove_all(sandbox);
}

Вывод:

"sandbox" exists
"sandbox/symlink" does not exist
"sandbox/file" exists

См. также

statussymlink_status
(C++17)(C++17)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символической ссылки
(функция)
file_status
(C++17)
представляет тип файла и разрешения
(класс)
exists
проверяет, ссылается ли запись каталога на существующий объект файловой системы
(открытая функция-член std::filesystem::directory_entry)

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

Spec-Zone.ru

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