Namespaces
Variants

std::filesystem:: is_symlink

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

Проверяет, соответствует ли данный статус файла или путь символической ссылке, как если бы это определялось POSIX S_IFLNK .

1) Эквивалентно s. type ( ) == file_type :: symlink .
2,3) Эквивалентно is_symlink ( symlink_status ( p ) ) или is_symlink ( symlink_status ( p, ec ) ) .

Содержание

Параметры

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

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

true если файл, указанный в p или если тип, указанный в s является символической ссылкой. Перегрузка без генерации исключений возвращает false при возникновении ошибки.

Исключения

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

2,3) Устанавливает параметр std:: error_code & в код ошибки API операционной системы при сбое вызова API ОС, и выполняет ec. clear ( ) если ошибок не возникает.

Пример

#include <cstdio>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::filesystem;
void demo_status(const fs::path& p, fs::file_status s)
{
    std::cout << p;
    // альтернатива: switch(s.type()) { case fs::file_type::regular: ...}
    if (fs::is_regular_file(s))
        std::cout << " является обычным файлом\n";
    if (fs::is_directory(s))
        std::cout << " является директорией\n";
    if (fs::is_block_file(s))
        std::cout << " является блочным устройством\n";
    if (fs::is_character_file(s))
        std::cout << " является символьным устройством\n";
    if (fs::is_fifo(s))
        std::cout << " является именованным IPC-каналом\n";
    if (fs::is_socket(s))
        std::cout << " является именованным IPC-сокетом\n";
    if (fs::is_symlink(s))
        std::cout << " является символьной ссылкой\n";
    if (!fs::exists(s))
        std::cout << " не существует\n";
}
int main()
{
    // создание файлов различных типов
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // создание обычного файла
    fs::create_symlink("file", "sandbox/symlink");
    mkfifo("sandbox/pipe", 0644);
    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    std::strcpy(addr.sun_path, "sandbox/sock");
    int fd = socket(PF_UNIX, SOCK_STREAM, 0);
    bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof addr);
    // демонстрация различных методов доступа к статусу
    for (auto it{fs::directory_iterator("sandbox")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // использование кэшированного статуса из записи директории
    demo_status("/dev/null", fs::status("/dev/null")); // прямые вызовы status
    demo_status("/dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
    // очистка (предпочтительно использовать пользовательские удалители на основе std::unique_ptr)
    close(fd);
    fs::remove_all("sandbox");
}

Возможный вывод:

"sandbox/file" является обычным файлом
"sandbox/dir" является директорией
"sandbox/pipe" является именованным IPC-каналом
"sandbox/sock" является именованным IPC-сокетом
"sandbox/symlink" является символьной ссылкой
"/dev/null" является символьным устройством
"/dev/sda" является блочным устройством
"sandbox/no" не существует

Смотрите также

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