Namespaces
Variants

std::experimental::filesystem:: is_symlink

From cppreference.net
Определено в заголовочном файле <experimental/filesystem>
bool is_symlink ( file_status s ) ;
(1) (filesystem TS)
bool is_symlink ( const path & p ) ;
bool is_symlink ( const path & p, error_code & ec ) ;
(2) (filesystem TS)

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

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

Содержание

Параметры

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

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

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

Исключения

1)
noexcept спецификация:
noexcept
2) Перегрузка, которая не принимает параметр error_code & , выбрасывает исключение filesystem_error при ошибках в нижележащем API операционной системы, создавая его с p в качестве первого аргумента и кодом ошибки ОС в качестве аргумента error code. std:: bad_alloc может быть выброшено, если выделение памяти завершилось неудачей. Перегрузка, принимающая параметр error_code & , устанавливает его в код ошибки API ОС, если вызов API ОС завершился неудачей, и выполняет ec. clear ( ) , если ошибок не произошло. Эта перегрузка имеет
noexcept спецификацию:
noexcept

Примечания

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

Пример

#include <cstdio>
#include <cstring>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <unistd.h>
namespace fs = std::experimental::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");
    std::ofstream("sandbox/file"); // создание обычного файла
    fs::create_directory("sandbox/dir");
    mkfifo("sandbox/pipe", 0644);
    struct 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, (struct sockaddr*)&addr, sizeof addr);
    fs::create_symlink("file", "sandbox/symlink");
    // демонстрация различных методов доступа к статусу
    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"));
    // очистка
    close(fd);
    fs::remove_all("sandbox");
}

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

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

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

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