【问题标题】:C <sys/stat.h> Find file typeC <sys/stat.h> 查找文件类型
【发布时间】:2017-11-29 21:01:07
【问题描述】:

我为一个项目创建了自己的 ls 命令,并使用“st_mode”变量来查找文件权限,但我不使用宏。

例如: st_mode = 16877

我将其转换为八进制:

st_mode = 40755

我保留最后三个字符并获得我的权限。

但是当我尝试查找文件的类型时,我尝试使用前两个字符,但它们并没有真正帮助我... 所以我想知道我是否可以使用前两个字符来查找文件的类型(链接、文件夹、...)。如果我不能,我应该使用什么来查找文件的类型

感谢您的帮助。

【问题讨论】:

    标签: c file types ls


    【解决方案1】:

    根据POSIX <sys/stat.h> documentation

    应提供以下宏来测试文件是否属于 指定的类型。提供给宏的值 m 是 st_mode 来自 stat 结构。宏应评估为非零 测试为真时的值;如果测试为假,则为 0。

    S_ISBLK(m)
        Test for a block special file.
    S_ISCHR(m)
        Test for a character special file.
    S_ISDIR(m)
        Test for a directory.
    S_ISFIFO(m)
        Test for a pipe or FIFO special file.
    S_ISREG(m)
        Test for a regular file.
    S_ISLNK(m)
        Test for a symbolic link.
    S_ISSOCK(m)
        Test for a socket.
    

    【讨论】:

    • 是的,但如果我使用宏检查,我需要检查每个案例
    • @M4gie 是的,但是如果我使用宏检查,我将需要检查每个案例无论如何,您必须检查所有您感兴趣的案例,无论是否使用宏。
    【解决方案2】:

    是的,您可以将这两种方法与下面的预定义宏一起使用,打开 stat() 系统调用的手册页,上面写着

    S_IFMT     0170000   bit mask for the file type bit fields
    

    &amp;st_modeS_IFMT 也是如此,你会得到文件类型

                    struct stat v;
                    stat(file,&v);  
                    switch (v.st_mode & S_IFMT) // type of file
                    {
    
                            case S_IFBLK:  printf("b");                 break;
                            case S_IFCHR:  printf("c");                 break;
                            case S_IFDIR:  printf("d");                 break;
                            case S_IFIFO:  printf("p");                 break;
                            case S_IFLNK:  printf("l");                 break;
                            case S_IFREG:  printf("-");                 break;
                            case S_IFSOCK: printf("s");                 break;
                            default:       printf("unknown?");          break;
                    }
    

    如果你不想使用宏,那么首先找出st_mode每种files的值,然后编写逻辑。例如,st_moderegular file 的值是 10664permission 的最后 3 位(664),写入 10664 的二进制你会知道 15th 位已设置,st.mode &gt;&gt; 15 也是如此。同样找到不同类型文件的st_mode值并分析。

    if( ( v.st_mode >> 15 & 1) && ( v.st_mode >> 14 & 1) ) 
                    printf("Socket File\n"); 
            else if( ( v.st_mode >> 15 & 1) && ( v.st_mode >> 13 & 1) )
                    printf("Symbolic Link File\n");
            else if( v.st_mode >> 15 & 1) 
                    printf("Regular File\n");
            else if((v.st_mode >> 14 & 1) && (v.st_mode >> 13 & 1) )
                    printf("Block Dev File\n");
            else if(v.st_mode >> 14 & 1) 
                    printf("Directory File\n");
            else if(v.st_mode >> 13 & 1)
                    printf("Char Dev File\n");
            else if(v.st_mode >> 12 & 1)
                    printf("FIFO/PIPE File\n");
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2013-08-19
      • 1970-01-01
      相关资源
      最近更新 更多