Namensräume
Varianten
Aktionen

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

Von cppreference.com
 
 
 
 
file_status status() const;
file_status status( error_code& ec ) const;
(1) (Dateisystem-TS)
file_status symlink_status() const;
file_status symlink_status( error_code& ec ) const;
(2) (Dateisystem-TS)
1) Gibt den potenziell zwischengespeicherten Status des Eintrags zurück, als ob er durch einen status-Aufruf ermittelt worden wäre (symbolische Links werden zu ihren Zielen verfolgt).
2) Gibt den potenziell zwischengespeicherten Status des Eintrags zurück, als ob er durch einen symlink_status-Aufruf ermittelt worden wäre (symbolische Links werden nicht verfolgt).

Inhalt

[bearbeiten] Parameter

ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[bearbeiten] Rückgabewert

Der Status der Datei, auf die sich der Eintrag bezieht.

[bearbeiten] Ausnahmen

Die Überladung, die keinen Parameter vom Typ error_code& enthält, löst filesystem_error bei Fehlern der zugrunde liegenden OS-API aus, konstruiert mit p als erstem Argument und dem OS-Fehlercode als Fehlercode-Argument. std::bad_alloc kann ausgelöst werden, wenn die Speicherzuweisung fehlschlägt. Die Überladung, die einen Parameter vom Typ error_code& enthält, setzt diesen auf den OS-API-Fehlercode, wenn ein OS-API-Aufruf fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten. Diese Überladung hat
noexcept-Spezifikation:  
noexcept
  

[bearbeiten] Hinweise

Die Datei-Statusinformationen werden normalerweise als Nebenprodukt der Verzeichnisiteration bereitgestellt, in welchem Fall sie zwischengespeichert werden und durch diese Memberfunktionen ohne zusätzliche Systemaufrufe abgerufen werden können. Während der Verzeichnisiteration ist das Aufrufen von status unnötig und Zugriffsfunktionen wie is_directory sollten mit dem zwischengespeicherten Statuswert aufgerufen werden, nicht mit einem Pfad.

[bearbeiten] Beispiel

#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;
    // 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");
    std::ofstream("sandbox/file"); // create regular 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");
 
    // 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
    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

[bearbeiten] Siehe auch

repräsentiert Dateityp und Berechtigungen
(Klasse) [bearbeiten]
ermittelt Dateiattribute
ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird
(Funktion) [bearbeiten]
prüft, ob der Dateistatus bekannt ist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Blockgerät verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Zeichengerät verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf ein Verzeichnis verweist
(Funktion) [bearbeiten]
prüft, ob der gegebene Pfad auf eine benannte Pipe verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf eine andere Datei verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf eine reguläre Datei verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf einen benannten IPC-Socket verweist
(Funktion) [bearbeiten]
prüft, ob das Argument auf einen symbolischen Link verweist
(Funktion) [bearbeiten]