繁体   English   中英

C:检查文件的类型。 使用lstat()和宏不起作用

[英]C: Checking the type of a file. Using lstat() and macros doesn't work

我使用opendir()打开一个目录,然后使用readdir()和lstat()来获取该目录中每个文件的统计信息。 在这个联机帮助页之后,我编写了代码,在该代码下无法正常工作。 它列出了当前目录中的所有文件,但是当文件是常规文件,符号链接或目录时,它不会打印出来。

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

void main(){

    char* folder=".";                                     //folder to open

    DIR* dir_p;
    struct dirent* dir_element;
    struct stat file_info;

    // open directory
    dir_p=opendir(folder);

    // show some info for each file in given directory
    while(dir_element = readdir(dir_p)){

        lstat(dir_element->d_name, &file_info);          //getting a file stats

        puts(dir_element->d_name);                       // show current filename
        printf("file mode: %d\n", file_info.st_mode);

        // print what kind of file we are dealing with
        if (file_info.st_mode == S_IFDIR) puts("|| directory");
        if (file_info.st_mode == S_IFREG) puts("|| regular file");
        if (file_info.st_mode == S_IFLNK) puts("|| symbolic link");
    }

}

有一组宏来解释st_mode ,它比你想象的要复杂得多。 使用它们而不是直接探测场:

if (S_ISREG(file_info.st_mode))
    // file is a regular file
else if (S_ISLNK(file_info.st_mode))
    // ...

还有S_ISDIRS_ISSOCK等等。 例如,请参见此处获取信息。

我知道这是几年之后但是对于后人你做错了:
@alk是正确的st_mode字段携带更多信息,例如文件类型,文件权限等
要提取文件类型,请按位执行并在st_mode字段和文件类型掩码S_IFMT上执行 。然后检查结果以查找所需内容。 这就是@Ernest Friedman-Hill提到的宏。 swicth更适合全面检查,即

对于一个简单的案例:

     if ((file_info.st_mode & S_IFMT)==S_IFDIR) puts("|| directory");

进行全面检查:

       struct stat st;
       ...

      switch (st.st_mode & S_IFMT) {
        case S_IFREG:  
            puts("|| regular file");
            break;
        case S_IFDIR:
            puts("|| directory");
            break;
        case S_IFCHR:        
            puts("|| character device");
            break;
        case S_IFBLK:        
            puts("|| block device");
            break;
        case S_IFLNK: 
            puts("|| symbolic link");
            break;
        case S_IFIFO: 
            puts("|| pipe");    
            break;
        case S_IFSOCK:
            puts("|| socket");
            break;
        default:
            puts("|| unknown"); 
     }

模式带有很多信息。

尝试以下类型的测试:

if (S_ISDIR(file_info.st_mode))  puts("|| directory");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM