std::experimental::filesystem::directory_entry::status, std::experimental::filesystem::directory_entry::symlink_status
Von cppreference.com
< cpp | experimental | fs | directory entry
| 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 hatnoexcept-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
Führen Sie diesen Code aus
#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) | |
| ermittelt Dateiattribute ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird (Funktion) | |
| prüft, ob der Dateistatus bekannt ist (Funktion) | |
| prüft, ob der gegebene Pfad auf ein Blockgerät verweist (Funktion) | |
| prüft, ob der gegebene Pfad auf ein Zeichengerät verweist (Funktion) | |
| prüft, ob der gegebene Pfad auf ein Verzeichnis verweist (Funktion) | |
| prüft, ob der gegebene Pfad auf eine benannte Pipe verweist (Funktion) | |
| prüft, ob das Argument auf eine andere Datei verweist (Funktion) | |
| prüft, ob das Argument auf eine reguläre Datei verweist (Funktion) | |
| prüft, ob das Argument auf einen benannten IPC-Socket verweist (Funktion) | |
| prüft, ob das Argument auf einen symbolischen Link verweist (Funktion) |