2010-10-21 6 views
7

Ich habe den folgenden Code nur ein Teil davon wird hier gezeigt und ich überprüfe, ob eine der Art der Datei.Wie herauszufinden, ob eine Datei eine Verbindung ist?

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 ein printf("\nMode: %d\n",buf.st_mode); das Ergebnis ist 33188.

ich mein Programm mit einem regulären Dateityp und einem symbolischen Link getestet. In beiden Fällen war die Ausgabe "reguläre Datei", d. H. Der Fall des symbolischen Links schlägt fehl und ich verstehe nicht warum?

+0

Die Frage ist ein wenig unklar. Testen Sie einen symbolischen Link und das Programm sagt, dass es sich um eine normale Datei handelt? Was ist der Wert von buf.st_mode? –

+0

@Gintautas: bearbeitet. –

+4

Sie brauchen 'lstat()'. 'stat()' folgt symbolischen Links und prüft die Dateien, auf die sie verweisen. –

Antwort

14

Vom stat (2) Manpage:

stat() Statistik der Datei, auf den Pfad hingewiesen und füllt in buf.

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

Mit anderen Worten, wird der stat Aufruf den symbolischen Link auf die Zieldatei folgen und die Informationen für diesem abzurufen. Versuchen Sie stattdessen lstat verwenden, es gibt Ihnen die Informationen für die Verbindung.


Wenn Sie wie folgt vor:

touch junkfile 
ln -s junkfile junklink 

dann kompilieren und das folgende Programm ausführen:

#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.

Verwandte Themen