std::filesystem::directory_entry::status, std::filesystem::directory_entry::symlink_status

From cppreference.com
 
 
 
 
(1) (since C++17)
std::filesystem::file_status status( std::error_code& ec ) const noexcept;
(2) (since C++17)
std::filesystem::file_status symlink_status() const;
(3) (since C++17)
std::filesystem::file_status symlink_status( std::error_code& ec ) const noexcept;
(4) (since C++17)
1,2) Returns status of the entry, as if determined by a filesystem::status call (symlinks are followed to their targets).
3,4) Returns status of the entry, as if determined by a filesystem::symlink_status call (symlinks are not followed).

Parameters

ec - out-parameter for error reporting in the non-throwing overload

Return value

The status of the file referred to by the entry.

Exceptions

Any overload not marked noexcept may throw std::bad_alloc if memory allocation fails.

1,3) Throws std::filesystem::filesystem_error on underlying OS API errors, constructed with p as the first path argument and the OS error code as the error code argument.
2,4) Sets a std::error_code& parameter to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur.

Notes

Many low-level OS APIs for directory traversal retrieve file attributes along with the next directory entry. The constructors and the non-const member functions of std::filesystem::directory_iterator store these attributes, if any, in the pointed-to std::filesystem::directory_entry without calling directory_entry::refresh, which makes it possible to examine the attributes of the directory entries as they are being iterated over, without making additional system calls.

Example

#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;
    // alternative: 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()
{
    // create files of different kinds
    fs::create_directory("sandbox");
    fs::create_directory("sandbox/dir");
    std::ofstream{"sandbox/file"}; // create regular 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);
 
    // demo different status accessors
    for (auto it{fs::directory_iterator("sandbox")}; it != fs::directory_iterator(); ++it)
        demo_status(*it, it->symlink_status()); // use cached status from directory entry
    demo_status("/dev/null", fs::status("/dev/null")); // direct calls to status
    demo_status("/dev/sda", fs::status("/dev/sda"));
    demo_status("sandbox/no", fs::status("/sandbox/no"));
 
    // cleanup (prefer std::unique_ptr-based custom deleters)
    close(fd);
    fs::remove_all("sandbox");
}

Possible output:

"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

See also

updates the cached file attributes
(public member function)
checks whether directory entry refers to existing file system object
(public member function)
checks whether the directory entry refers to block device
(public member function)
checks whether the directory entry refers to a character device
(public member function)
checks whether the directory entry refers to a directory
(public member function)
checks whether the directory entry refers to a named pipe
(public member function)
checks whether the directory entry refers to an other file
(public member function)
checks whether the directory entry refers to a regular file
(public member function)
checks whether the directory entry refers to a named IPC socket
(public member function)
checks whether the directory entry refers to a symbolic link
(public member function)
returns the size of the file to which the directory entry refers
(public member function)
returns the number of hard links referring to the file to which the directory entry refers
(public member function)
gets the time of the last data modification of the file to which the directory entry refers
(public member function)