2010-10-21 7 views
7

Ho il codice sottostante solo una parte di esso è mostrato qui e sto verificando se un tipo di file.Come capire se un file è un collegamento?

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; 
} 

Il problema: valore della st_mode ottenuto quando faccio una printf("\nMode: %d\n",buf.st_mode); il risultato è 33188.

ho provato il mio programma con un tipo di file regolare e un link simbolico. In entrambi i casi l'output era "file normale", il caso del collegamento simbolico non funziona e non riesco a capire perché?

+0

La domanda è un po 'poco chiara. Stai testando un link simbolico e il programma dice che è un file normale? Qual è il valore di buf.st_mode? –

+0

@Gintautas: modificato. –

+4

È necessario 'lstat()'. 'stat()' segue i collegamenti simbolici e controlla i file a cui puntano. –

risposta

14

Dalla pagina stat (2) man:

stat() stats il file puntato da percorso e riempie buf.

lstat() è identico a stat(), eccetto che se il percorso è un collegamento simbolico, il collegamento stesso è stat-ed non il file a cui si riferisce.

In altre parole, la chiamata stat seguirà il collegamento simbolico per il file di destinazione e recuperare le informazioni per questo. Prova a utilizzare lstat invece, ti darà le informazioni per il collegamento .


Se fate la seguente:

touch junkfile 
ln -s junkfile junklink 

quindi compilare ed eseguire il seguente programma:

#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; 
} 

si otterrà:

stat says file 
lstat says link 

come previsto.