2010-10-21 14 views
7

Aşağıdaki kodun sadece bir kısmı burada gösteriliyor ve bir dosya türünün olup olmadığını kontrol ediyorum.Bir dosya bir bağlantı olup olmadığını nasıl anlarsınız?

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

sorun: Elde st_mode değeri sonucun ben normal bir dosya türü ve sembolik link ile benim programı test 33188.

bir printf("\nMode: %d\n",buf.st_mode); ne zaman. Her iki durumda da çıktı "düzenli dosya" idi, yani sembolik bağlantı durumu başarısız oluyor ve nedenini anlayamıyorum? stat (2) adam sayfasından

+0

Soru biraz belirsizdir. Sembolik bir bağlantıyı test ediyor musunuz, program normal bir dosya mı diyor? Buf.st_mode değeri nedir? –

+0

@Gintautas: düzenlenmiş. –

+4

lstat() 'gerekir. stat() 'sembolik bağları izler ve işaret ettikleri dosyaları denetler. –

cevap

14

:

stat() dosya yoluna göre işaret istatistik ve buf doldurur.

lstat() hariç stat() özdeştir yolu sembolik bağ, ise, o zaman bağlantı kendisi stat ed değil belirtir dosyası olduğunu gösterir. Başka bir deyişle

, stat çağrı hedef dosyaya sembolik bağlantıyı takip ve bunun için bilgilerinizi alır.lstat kullanmayı deneyin, size bağlantısı için bilgi verecektir.


aşağıdaki yaparsanız:

touch junkfile 
ln -s junkfile junklink 

sonra derlemek ve aşağıdaki programı çalıştırın:

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

alırsınız: beklendiği gibi

stat says file 
lstat says link 

.

İlgili konular