在Linux类文件系统中,每个文件都对应一个唯一的inode,inode中存储了文件的所有底层元数据,比如文件大小、所属用户、访问权限、创建修改时间、硬链接数量等信息,这些元数据并不存储在文件内容中,而是由文件系统统一管理。C++可以通过系统提供的stat系列调用来获取这些信息,从而拿到文件的inode相关数据。

stat系统调用基础说明
stat是Linux系统提供的用于获取文件元数据的系统调用,对应的C标准库函数声明在<sys/stat.h>头文件中,函数原型如下:
#include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int stat(const char *pathname, struct stat *statbuf);
函数接收两个参数,第一个是要查询的文件路径,第二个是指向struct stat结构体的指针,调用成功后,文件的inode元数据会被填充到这个结构体中,函数返回0表示调用成功,返回-1表示调用失败,错误信息可以通过errno获取。
struct stat结构体字段解析
struct stat结构体中包含了inode相关的所有核心元数据,不同系统下字段可能略有差异,Linux下的常见字段含义如下:
| 字段名 | 类型 | 含义说明 |
|---|---|---|
| st_ino | ino_t | 文件的inode编号,唯一标识文件 |
| st_mode | mode_t | 文件的类型和访问权限,可通过宏判断文件类型 |
| st_nlink | nlink_t | 文件的硬链接数量 |
| st_uid | uid_t | 文件所有者的用户ID |
| st_gid | gid_t | 文件所有者的组ID |
| st_size | off_t | 文件的大小,单位是字节 |
| st_atime | time_t | 最后一次访问时间 |
| st_mtime | time_t | 最后一次内容修改时间 |
| st_ctime | time_t | 最后一次元数据修改时间 |
完整的C++获取inode元数据示例
下面是一个完整的C++示例,演示如何调用stat获取指定文件的inode元数据并打印关键信息:
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctime>
#include <cerrno>
#include <cstring>
int main() {
const char *file_path = "./test.txt";
struct stat file_stat;
// 调用stat获取文件元数据
if (stat(file_path, &file_stat) == -1) {
std::cerr << "获取文件元数据失败,错误信息:" << strerror(errno) << std::endl;
return 1;
}
// 打印inode相关元数据
std::cout << "文件" << file_path << "的inode元数据如下:" << std::endl;
std::cout << "inode编号:" << file_stat.st_ino << std::endl;
std::cout << "文件大小:" << file_stat.st_size << " 字节" << std::endl;
std::cout << "硬链接数量:" << file_stat.st_nlink << std::endl;
std::cout << "所有者用户ID:" << file_stat.st_uid << std::endl;
std::cout << "所有者组ID:" << file_stat.st_gid << std::endl;
// 转换时间并输出
std::cout << "最后访问时间:" << ctime(&file_stat.st_atime);
std::cout << "最后修改时间:" << ctime(&file_stat.st_mtime);
std::cout << "最后元数据修改时间:" << ctime(&file_stat.st_ctime);
return 0;
}
注意事项
- 如果查询的是符号链接,stat默认会返回符号链接指向的目标文件的元数据,如果需要获取符号链接本身的元数据,可以使用
lstat函数,其参数和返回值与stat完全一致。 - st_mode字段可以通过S_ISREG、S_ISDIR等宏判断文件类型,比如S_ISREG(file_stat.st_mode)返回true表示是普通文件,S_ISDIR(file_stat.st_mode)返回true表示是目录。
- stat调用需要进程对查询的文件路径有相应的访问权限,否则会返回权限错误。