电脑技术学习

UNIX 文件系统基本操作

dn001

  S_ISDIR(mode)——是否为目录?

  S_ISFIFO(mode)——是否为管道或 FIFO 特殊文件?

  S_ISLNK(mode)——是否为符号链接?

  S_ISREG(mode)——是否为普通文件?

  众所周知,在大多数文件系统上,stat() 函数的执行速度非常慢,所以如果您打算在将来再次使用该信息,可能需要对其进行缓存。

  关于符号链接的说明

  通常,您并不关心符号链接。如果对符号链接调用 stat(),那么您将获取该链接所指向的文件的相关信息。这和用户的体验是一致的,因为控制与该文件交互的是目标文件的权限,而不是符号链接本身。

  有些应用程序,如 ls 和备份程序,需要能够显示链接文件本身的相关信息,例如它所指向的文件。当您使用 lstat() 来代替 stat() 时,以及当您出于特定的目的而需要获取符号链接本身的相关信息,而不是直接与其链接的文件打交道时,情况也是这样的。

  将其组合在一起

  既然已经学习了如何使用 readdir() 和 stat() 来查找目录中的条目,那么让我们来看看演示这些函数的一些实际代码。

  这里所介绍的代码将浏览命令行中指定的一个或多个目录,并显示在该目录中找到的每个条目的相关信息。当它找到另一个目录时,它会对该目录进行同样的处理。对于符号链接,将显示其目标文件,并且还将显示普通文件的大小。将忽略特殊文件。

  如清单 2 所示,这个简单的演示应用程序中包含了各种 Header 文件。程序的开始块中包含了大多数程序中使用的标准部分,并且后面的四项是在该程序中使用 readdir() 和 stat() 所必需的。

  清单 2. Header 和常量

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

标签: