一、stat函数的核心作用
stat 函数的核心作用是获取一个文件或文件系统对象(如目录、符号链接、设备文件等)的元数据(也称为文件属性/状态信息),它不会读取文件的实际内容,仅提取描述文件本身属性的相关信息,是文件操作中查询文件属性的核心函数之一。
二、stat函数的工作机制
- 输入:函数接收两个关键参数,一是目标文件/对象的路径名(字符串形式),二是一个指向 struct stat 类型结构体的指针。
- 输出与存储:函数调用成功后,会将查询到的文件元数据自动填充到 struct stat 结构体中,用户通过访问该结构体的成员变量,即可获取所需的文件属性信息;调用失败时会返回错误码,并设置 errno 标识错误原因。
- 关键特性: stat 函数不会跟随符号链接(软链接)------如果传入的路径是一个软链接, stat 返回的是该软链接本身的元数据,而非软链接所指向的目标文件的属性。
三、 struct stat 结构体存储的核心文件信息
struct stat 是专门用于承载文件元数据的结构体,其核心成员(跨平台通用度较高)包括:
- 文件类型与访问权限: st_mode ,用于判断文件是普通文件、目录、软链接、设备文件等,同时记录文件的读/写/执行权限(所有者、所属组、其他用户)。
- 文件大小: st_size ,记录普通文件的字节数大小(对于目录等特殊文件,该值通常表示目录项的大小,无实际文件内容大小意义)。
- 硬链接数: st_nlink ,表示指向该文件inode的硬链接数量(Unix/Linux系统中,文件的本质是inode,硬链接是inode的别名)。
- 所有者与所属组ID: st_uid (文件所有者的用户ID)、 st_gid (文件所属组的组ID)。
- 时间戳(三个核心时间):
- st_atime :文件最后访问时间(如使用 cat 读取文件内容后,该时间会更新);
- st_mtime :文件内容最后修改时间(如使用 vim 编辑并保存文件后,该时间会更新);
- st_ctime :文件元数据最后修改时间(如修改文件权限、重命名文件后,该时间会更新,注意不是文件创建时间)。
- inode编号: st_ino ,Unix/Linux系统中文件的唯一标识(同一文件系统中inode号不重复)。
- 存储设备信息: st_dev (文件所在设备的设备ID)、 st_rdev (特殊设备文件对应的设备ID)。
四、stat函数的典型应用场景
- 判断文件是否存在:通过调用 stat 函数的返回值判断,若返回0则文件存在,若返回-1且 errno 为 ENOENT ,则文件不存在。
- 验证文件类型:通过解析 st_mode 成员,判断目标路径是普通文件、目录、软链接还是设备文件(如使用 S_ISREG() 判断普通文件、 S_ISDIR() 判断目录)。
- 获取文件大小与权限:直接读取 st_size (文件大小)、 st_mode (权限解析),用于后续文件操作的前置判断(如读取文件前确认文件大小、写入文件前确认是否有写入权限)。
- 文件同步与备份:通过获取 st_mtime (内容修改时间),判断文件是否被更新,从而决定是否需要执行备份操作。
- 清理过期文件:通过对比 st_atime (最后访问时间),筛选出长期未访问的文件进行清理。
五、相关函数(lstat、fstat)
与 stat 功能类似的还有两个核心函数,它们的区别主要在于适用场景和对软链接的处理:
- lstat函数:与 stat 的参数、返回值完全一致,唯一区别是lstat会跟随软链接------如果传入的路径是软链接,lstat返回的是软链接指向的目标文件的元数据,而非软链接本身。
- fstat函数:不接收文件路径,而是接收一个**已打开的文件描述符(file descriptor)**作为参数,用于获取已打开文件的元数据。fstat同样不跟随软链接,且由于操作的是已打开文件,无需再次解析路径,效率更高,适合在文件读写过程中查询文件属性。
总结
- stat 核心:获取文件/文件系统对象的元数据,不读取文件内容,不跟随软链接;
- 数据载体: struct stat 结构体,包含文件类型、大小、权限、时间戳等核心信息;
- 典型用途:判断文件存在性、验证文件类型、获取文件属性用于前置操作判断;
- 相关函数:lstat(跟随软链接)、fstat(操作已打开文件的文件描述符)。