2010-10-21 50 views
7

我有下面的代码只有它的一部分显示在这里我正在检查文件的类型。如何确定文件是否为链接?

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

问题:获得st_mode值当我做了printf("\nMode: %d\n",buf.st_mode);结果是33188.

我测试我的程序与规则的文件类型和符号链接。在这两种情况下,输出都是“常规文件”,即符号链接案例失败,我不明白为什么?

+0

这个问题有点不清楚。你在测试一个符号链接,并且该程序说它是一个常规文件吗?什么是buf.st_mode的价值? – 2010-10-21 06:52:06

+0

@Gintautas:编辑。 – 2010-10-21 06:56:37

+4

你需要'lstat()'。 'stat()'遵循符号链接并检查它们指向的文件。 – 2010-10-21 07:12:54

回答

14

stat (2)手册页:

stat()统计文件的路径指向和buf罢了。

lstat()stat()相同,只是如果路径是符号链接,则链接本身是stat-ed,而不是它引用的文件。

换句话说,stat调用将遵循目标文件的符号链接并检索的信息。尝试使用lstat代替,它会为您提供链接的信息。


如果你做到以下几点:

touch junkfile 
ln -s junkfile junklink 

然后编译并运行下面的程序:

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

您将获得:

stat says file 
lstat says link 

预期。