Wie finde ich heraus, ob eine Datei ein Link ist?

Lesezeit: 2 Minuten

Benutzer-Avatar
Ewiger Lernender

Ich habe den folgenden Code hier wird nur ein Teil davon gezeigt und ich überprüfe, ob ein Dateityp vorliegt.

struct stat *buf /* just to show the type buf is*/ 

switch (buf.st_mode & S_IFMT) {
     case S_IFBLK:  printf(" block device\n");            break;
     case S_IFCHR:  printf(" character device\n");        break;
     case S_IFDIR:  printf(" directory\n");               break;
     case S_IFIFO:  printf(" FIFO/pipe\n");               break;
     case S_IFLNK:  printf(" symlink\n");                 break;
     case S_IFREG:  printf(" regular file\n");            break;
     case S_IFSOCK: printf(" socket\n");                  break;
     default:       printf(" unknown?\n");                break;
}

Das Problem: Wert von st_mode erhalten, wenn ich a printf("\nMode: %d\n",buf.st_mode); das Ergebnis ist 33188.

Ich habe mein Programm mit einem normalen Dateityp und einem symbolischen Link getestet. In beiden Fällen war die Ausgabe “normale Datei”, dh der symbolische Linkfall schlägt fehl und ich verstehe nicht, warum?

  • Die Frage ist etwas unklar. Testen Sie einen symbolischen Link und das Programm sagt, es sei eine normale Datei? Welchen Wert hat buf.st_mode?

    – Gintautas Miliauskas

    21. Oktober 2010 um 6:52 Uhr

  • Du brauchst lstat(). stat() folgt symbolischen Links und überprüft die Dateien, auf die sie verweisen.

    – Michael Foukarakis

    21. Oktober 2010 um 7:12 Uhr

Benutzer-Avatar
paxdiablo

Von dem stat (2) Manpage:

stat() gibt die Datei an, auf die der Pfad zeigt, und füllt sie aus buf.

lstat() ist identisch mit stat()außer dass, wenn Pfad ein symbolischer Link ist, der Link selbst angegeben wird, nicht die Datei, auf die er verweist.

Mit anderen Worten, die stat Aufruf folgt dem symbolischen Link zur Zieldatei und ruft die Informationen für ab das. Versuchen Sie es mit lstat Stattdessen erhalten Sie die Informationen für die Verknüpfung.


Wenn Sie Folgendes tun:

touch junkfile
ln -s junkfile junklink

Kompilieren Sie dann das folgende Programm und führen Sie es aus:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main (void) {
    struct stat buf;
    int x;

    x = stat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf (" stat says link\n");
    if (S_ISREG(buf.st_mode)) printf (" stat says file\n");

    x = lstat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n");
    if (S_ISREG(buf.st_mode)) printf ("lstat says file\n");

    return 0;
}

Sie erhalten:

 stat says file
lstat says link

wie erwartet.

1176060cookie-checkWie finde ich heraus, ob eine Datei ein Link ist?

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

Privacy policy