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 & パラメータを取らないオーバーロードは、基盤となるOS APIエラーが発生した場合に filesystem_error をスローします。これは p を第1引数、OSエラーコードをエラーコード引数として構築されます。 std:: bad_alloc はメモリ確保が失敗した場合にスローされる可能性があります。 error_code & パラメータを取るオーバーロードは、OS API呼び出しが失敗した場合にそれをOS 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 << " is a regular file\n";
    if (fs::is_directory(s))
        std::cout << " is a directory\n";
    if (fs::is_block_file(s))
        std::cout << " is a block device\n";
    if (fs::is_character_file(s))
        std::cout << " is a character device\n";
    if (fs::is_fifo(s))
        std::cout << " is a named IPC pipe\n";
    if (fs::is_socket(s))
        std::cout << " is a named IPC socket\n";
    if (fs::is_symlink(s))
        std::cout << " is a symlink\n";
    if (!fs::exists(s))
        std::cout << " does not exist\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" is a regular file
"sandbox/dir" is a directory
"sandbox/pipe" is a named IPC pipe
"sandbox/sock" is a named IPC socket
"sandbox/symlink" is a symlink
"dev/null" is a character device
"dev/sda" is a block device
"sandbox/no" does not exist

関連項目

ファイル属性を決定する
シンボリックリンクのターゲットをチェックしてファイル属性を決定する
(関数)
ファイルタイプとパーミッションを表現する
(クラス)
ファイルステータスが既知かどうかをチェックする
(関数)
指定されたパスがブロックデバイスを参照しているかチェックする
(関数)
指定されたパスがキャラクターデバイスを参照しているかチェックする
(関数)
指定されたパスがディレクトリを参照しているかチェックする
(関数)
指定されたパスが名前付きパイプを参照しているかチェックする
(関数)
引数が その他 のファイルを参照しているかチェックする
(関数)
引数が通常ファイルを参照しているかチェックする
(関数)
引数が名前付きIPCソケットを参照しているかチェックする
(関数)
パスが既存のファイルシステムオブジェクトを参照しているかチェックする
(関数)
このディレクトリエントリによって指定されたファイルのキャッシュされたステータス
このディレクトリエントリによって指定されたファイルのキャッシュされたシンボリックリンクステータス
( std::experimental::filesystem::directory_entry の公開メンバー関数)