Namespaces
Variants

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

From cppreference.net
Definiert im Header <filesystem>
(1) (seit C++17)
(2) (seit C++17)
(3) (seit C++17)
(4) (seit C++17)
1,2) Bestimmt den Typ und die Attribute des Dateisystemobjekts, das durch p identifiziert wird, wie durch POSIX stat (Symlinks werden zu ihren Zielen aufgelöst). In der folgenden Beschreibung ist prms das Ergebnis von ( m & perms :: mask ) , wobei m erhalten wird, indem st_mode aus der POSIX struct stat genommen und in den Typ std:: filesystem :: perms konvertiert wird.
  • Wenn p eine reguläre Datei ist (wie durch POSIX S_ISREG ), gibt file_status ( file_type :: regular , prms ) zurück.
  • Wenn p ein Verzeichnis ist (wie durch POSIX S_ISDIR ), gibt file_status ( file_type :: directory , prms ) zurück.
  • Wenn p eine Block-Spezialdatei ist (wie durch POSIX S_ISBLK ), gibt file_status ( file_type :: block , prms ) zurück.
  • Wenn p eine Zeichen-Spezialdatei ist (wie durch POSIX S_ISCHR ), gibt file_status ( file_type :: character , prms ) zurück.
  • Wenn p eine FIFO- oder Pipe-Datei ist (wie durch POSIX S_ISFIFO ), gibt file_status ( file_type :: fifo , prms ) zurück.
  • Wenn p ein Socket ist (wie durch POSIX S_ISSOCK ), gibt file_status ( file_type :: socket , prms ) zurück.
  • Wenn p einen implementierungsdefinierten Dateityp hat, gibt file_status ( file_type :: A , prms ) zurück, wobei A die implementierungsdefinierte file_type -Konstante für diesen Typ ist.
  • Wenn p nicht existiert, gibt file_status ( file_type :: not_found ) zurück.
  • Wenn p existiert, aber die Dateiattribute nicht bestimmt werden können, z.B. aufgrund fehlender Berechtigungen, gibt file_status ( file_type :: unknown ) zurück.
  • Wenn Fehler verhindern, dass überhaupt bekannt ist, ob p existiert, setzt die nicht-werfende Überladung ec und gibt file_status ( file_type :: none ) zurück, und die werfende Überladung wirft filesystem_error .
  • Andernfalls gibt file_status ( file_type :: unknown , prms ) zurück.
3,4) Gleich wie (1,2) außer dass das Verhalten dem der POSIX-Funktion lstat entspricht (Symlinks werden nicht verfolgt):
  • Wenn p ein Symlink ist, gibt file_status ( file_type :: symlink ) zurück.

Inhaltsverzeichnis

Parameter

p - zu untersuchender Pfad
ec - Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung

Rückgabewert

Der Dateistatus (ein filesystem::file_status Objekt).

Ausnahmen

Jede Überladung, die nicht als noexcept gekennzeichnet ist, kann std::bad_alloc auslösen, wenn die Speicherallokation fehlschlägt.

1,3) Wirft std::filesystem::filesystem_error bei zugrundeliegenden OS-API-Fehlern, konstruiert mit p als erstem Pfadargument und dem OS-Fehlercode als Fehlercodeargument.
2,4) Setzt einen std:: error_code & Parameter auf den OS-API-Fehlercode, falls ein OS-API-Aufruf fehlschlägt, und führt ec. clear ( ) aus, falls keine Fehler auftreten.

Hinweise

Die von dieser Funktion bereitgestellten Informationen werden normalerweise auch als Nebenprodukt der Verzeichnisiteration bereitgestellt und können durch die Memberfunktionen von filesystem::directory_entry abgerufen werden. Während der Verzeichnisiteration ist ein erneutes Aufrufen von status unnötig.

Beispiel

#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");
}

Mögliche Ausgabe:

"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

Siehe auch

repräsentiert Dateityp und Berechtigungen
(Klasse)
prüft, ob der Dateistatus bekannt ist
(Funktion)
prüft, ob der angegebene Pfad auf ein Blockgerät verweist
(Funktion)
prüft, ob der angegebene Pfad auf ein Zeichengerät verweist
(Funktion)
prüft, ob der angegebene Pfad auf ein Verzeichnis verweist
(Funktion)
(C++17)
prüft, ob der angegebene Pfad auf eine benannte Pipe verweist
(Funktion)
(C++17)
prüft, ob das Argument auf eine andere Datei verweist
(Funktion)
prüft, ob das Argument auf eine reguläre Datei verweist
(Funktion)
(C++17)
prüft, ob das Argument auf einen benannten IPC-Socket verweist
(Funktion)
(C++17)
prüft, ob das Argument auf einen symbolischen Link verweist
(Funktion)
(C++17)
prüft, ob der Pfad auf ein existierendes Dateisystemobjekt verweist
(Funktion)
Status der durch diesen Verzeichniseintrag bezeichneten Datei;
Status der durch diesen Verzeichniseintrag bezeichneten Datei/Symlink
(öffentliche Memberfunktion von std::filesystem::directory_entry )