Überprüfen, ob ein Verzeichnis in Unix existiert (Systemaufruf)

Lesezeit: 4 Minuten

Uberprufen ob ein Verzeichnis in Unix existiert Systemaufruf
Jary

Ich kann online keine Lösung für mein Problem finden.

Ich möchte eine Funktion in Unix aufrufen, den Pfad eines Verzeichnisses übergeben und wissen, ob es existiert. opendir() gibt einen Fehler zurück, wenn ein Verzeichnis nicht existiert, aber mein Ziel ist es nicht, tatsächlich zu öffnen, den Fehler zu überprüfen, es zu schließen, wenn kein Fehler auftritt, sondern nur zu prüfen, ob eine Datei ein Verzeichnis ist oder nicht.

Gibt es bitte eine bequeme Möglichkeit, das zu tun?

  • Warum hast du auf die Frage einen Systemaufruf geschrieben? Wollen Sie wirklich einen Systemaufruf, der möglicherweise nur auf einem einzigen Betriebssystemtyp (Linux, BSD usw.) funktioniert, oder eine POSIX-Funktion aus den Posix-C-Headern (die auf jeder UNIX-Distribution funktionieren sollte)?

    – Ciro Santilli 新疆再教育营六四事件法轮功郝海东

    16. Juni 2013 um 15:57 Uhr


  • Wenn Sie nach weiteren Antworten suchen, die nicht auf Systemaufrufe angewiesen sind, lesen Sie C++ – Bestimmen, ob ein Verzeichnis (keine Datei) in Linux existiert

    – Roi Danton

    26. August 2018 um 10:16 Uhr


1646256008 439 Uberprufen ob ein Verzeichnis in Unix existiert Systemaufruf
Jonathan Leffler

Auf POSIX-Systemen gibt es zwei relevante Funktionen: stat() und lstat(). Diese werden verwendet, um herauszufinden, ob sich ein Pfadname auf ein tatsächliches Objekt bezieht, auf das Sie Zugriff haben, und wenn ja, sagen Ihnen die zurückgegebenen Daten, um welche Art von Objekt es sich handelt. Der Unterschied zwischen stat() und lstat() ist der von Ihnen angegebene Name ein symbolischer Link, stat() folgt dem symbolischen Link (oder Links, wenn sie miteinander verkettet sind) und berichtet über das Objekt am Ende der Kette von Links, während lstat() berichtet über den symbolischen Link selbst.

#include <sys/stat.h>

struct stat sb;

if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode))
{
    ...it is a directory...
}

Wenn die Funktion anzeigt, dass sie erfolgreich war, verwenden Sie das Makro S_ISDIR() aus <sys/stat.h> um festzustellen, ob es sich bei der Datei tatsächlich um ein Verzeichnis handelt.

Sie können auch mit other nach anderen Dateitypen suchen S_IS* Makros:

  • S_ISDIR – Verzeichnis
  • S_ISREG — normale Datei
  • S_ISCHR — Zeichengerät
  • S_ISBLK — Gerät blockieren
  • S_ISFIFO —FIFO
  • S_ISLNK – symbolischer Link
  • S_ISSOCK – Steckdose

(Einige Systeme bieten auch einige andere Dateitypen an; S_ISDOOR ist beispielsweise auf Solaris verfügbar.)

  • stat erwartet, dass der Pfadname-Parameter ein Zeichen ist?

    – IgorGanapolsky

    14. Juni 2017 um 15:13 Uhr

  • Kein char aber ein char * – ein Faden. Die Links zur POSIX-Spezifikation für die Funktionen zeigen, dass das erste Argument to stat() und lstat() ist const char * restrict pathname.

    – Jonathan Leffler

    14. Juni 2017 um 15:14 Uhr


  • prüfen Hier um weitere Informationen zu sehen S_IS* Makros

    – m4l490n

    31. Januar 2020 um 22:31 Uhr


  • @m4l490n: Aus der POSIX-Spezifikation für <sys/stat.h>, wie in der Antwort verlinkt. Es hat Definitionen wie: S_ISBLK(m) — Test auf eine spezielle Blockdatei.

    – Jonathan Leffler

    31. Januar 2020 um 22:32 Uhr


Uberprufen ob ein Verzeichnis in Unix existiert Systemaufruf
codaddict

Sie können die verwenden stat Systemaufruf, indem Sie ihm den Namen des Verzeichnisses als erstes Argument übergeben. Wenn das Verzeichnis existiert a 0 wird sonst zurückgegeben -1 zurückgegeben und errno wird auf gesetzt ENOENT

BEARBEITEN:

Wenn der Rückgabewert ist 0 Sie müssten eine zusätzliche Überprüfung durchführen, um sicherzustellen, dass das Argument tatsächlich ein Verzeichnis ist und nicht eine Datei/symlink/char-Spezialdatei/blk-Spezialdatei/FIFO-Datei. Sie können die verwenden st_mode Feld der stat structure dafür.

Wenn Sie sich nicht wirklich um den Typ dieses Dateisystemobjekts kümmern, prüft access(name, F_OK), ob etwas mit diesem Namen existiert. Wenn Sie sicher sein müssen, dass es sich um ein Verzeichnis handelt, verwenden Sie stat() und überprüfen Sie den Typ mit dem Makro S_ISDIR().

  • Beachten Sie, dass, wenn die tatsächliche und die effektive UID nicht identisch sind (Sie führen ein setuid-Programm aus), die access() Systemaufrufe beantworten eine andere Frage aus stat(). Konkret prüft es, ob die echte UID (RUID) auf die Datei zugreifen kann, während alle anderen Systemaufrufe mit der effektiven UID (EUID) arbeiten – inklusive opendir().

    – Jonathan Leffler

    3. August 2016 um 20:36 Uhr

  • Wenn das F_OK-Flag verwendet wird, prüft access() tatsächlich nicht auf Zugriffsrechte, sondern nur auf die Existenz von Datei/Verzeichnis/etc.

    – lodern

    4. August 2016 um 0:45 Uhr


  • Aber auch mit F_OKauf die du stoßen kannst EACCES wenn der Name weitergegeben wird access() hat mehrere Pfadkomponenten und der aktuelle Prozess (EUID) hat keine Berechtigung, eine der führenden Verzeichniskomponenten zu durchsuchen (also prüft er die Existenz eines einfachen Dateinamens OK, aber es kann zu Problemen mit einem nicht einfachen Dateinamen kommen).

    – Jonathan Leffler

    4. August 2016 um 0:49 Uhr

Uberprufen ob ein Verzeichnis in Unix existiert Systemaufruf
Aishwary Dewangan

Ein anderer einfacher Weg wäre:

int check(unsigned const char type) {
    if(type == DT_REG)
        return 1;
    if(type == DT_DIR)
        return 0;
    return -1;
}

Sie können dann passieren struct dirent* d_type des Objekts zu prüfen Funktion.

Wenn die Prüfung 1 zurückgibt, zeigt dieser Pfad auf eine reguläre Datei.

Wenn check 0 zurückgibt, zeigt dieser Pfad auf ein Verzeichnis.

Ansonsten ist es weder eine Datei noch ein Verzeichnis (es kann ein Block Device/Symbolic Link usw. sein).

916240cookie-checkÜberprüfen, ob ein Verzeichnis in Unix existiert (Systemaufruf)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy