C <sys stat.h =“”>查找文件类型

时间:2017-11-29 21:01:07

标签: c file types ls

我为项目创建了自己的ls命令,并使用&#34; st_mode&#34;变量以查找文件权限但我不使用宏。

例: st_mode = 16877

我将它转换为八进制基数:

st_mode = 40755

我保留了最后三个字符,然后获得了我的权限。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

根据POSIX <sys/stat.h> documentation

  

应提供以下宏来测试文件是否属于   指定的类型。提供给宏的值m是值   来自stat结构的st_mode。宏应评估为非零   如果测试为真,则为值;如果测试结果为假,则为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.

答案 1 :(得分:0)

是的,您可以将这两种方法与预定义的宏一起使用,如下所示,打开stat()系统调用的手册页,它说

S_IFMT     0170000   bit mask for the file type bit fields

&st_mode的{​​{1}}也是如此,您将获得文件类型

S_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; } &amp;的每种类型的st_mode值。然后写出逻辑。例如,files的{​​{1}}值为st_moderegular file的最后3位数(664),写入10664的二进制文件,您将会知道10664位设置为permission。同样找到不同类型文件的st_mode值&amp;分析

15th

我希望它有所帮助。