C++中获取文件inode及元数据需调用系统接口:一、stat()读取struct stat;二、fstat()查已开fd;三、lstat()处理符号链接;四、statx()获扩展信息;五、ioctl()+FS_IOC_GETVERSION取i_generation。

如果您在 C++ 程序中需要获取文件在文件系统层面的唯一标识符(如 inode 编号)及其关联的元数据(如大小、权限、时间戳等),则必须通过底层系统调用接口访问内核维护的 inode 信息。Linux 和类 Unix 系统中,stat 系统调用是直接读取 inode 元数据的核心机制。以下是实现该功能的多种方法:
一、使用 stat() 函数读取 struct stat 结构体
该方法通过标准 C 库封装的 stat() 函数,向内核发起系统调用,填充 struct stat 结构体,其中 st_ino 字段即为文件的 inode 编号,其余字段对应各类元数据。
1、包含必要头文件:
2、声明一个 struct stat 类型变量,例如:struct stat sb;
立即学习“C++免费学习笔记(深入)”;
3、调用 stat() 函数并传入目标文件路径与结构体地址:stat("/path/to/file", &sb);
4、检查返回值是否为 0;若为 -1,则通过 errno 判断错误原因。
5、从 sb.st_ino 中读取 inode 编号,从 sb.st_mode、sb.st_size、sb.st_mtime 等字段提取对应元数据。
二、使用 fstat() 对已打开文件描述符进行查询
当文件已通过 open() 打开并持有有效 fd 时,fstat() 可避免重复路径解析开销,直接基于 fd 获取其关联 inode 的最新元数据,适用于频繁查询或需保持文件状态一致性的场景。
1、使用 open() 获取文件描述符,例如:int fd = open("/path/to/file", O_RDONLY);
2、声明 struct stat 变量 sb;
3、调用 fstat(fd, &sb);
4、验证返回值,仅当返回 0 时继续读取 sb.st_ino 等字段。
5、使用 close(fd) 关闭文件描述符。
三、使用 lstat() 区分符号链接与其目标
当路径可能指向符号链接时,lstat() 不会自动解引用,而是返回符号链接自身 inode 的元数据,从而确保 st_ino 字段反映的是链接文件本身的 inode,而非其所指向的目标文件。
1、包含
生成Blender Python (bpy)脚本,该脚本使用node_groups API和GeometryNodeTree接口程序化地创建几何节点修改器树,用于参数化3D资产生成。
2、定义 struct stat sb;
3、调用 lstat("/path/to/symlink", &sb);
4、判断 sb.st_mode 是否包含 S_IFLNK 标志以确认是否为符号链接。
5、从 sb.st_ino 提取该符号链接文件自身的 inode 编号。
四、使用 statx() 系统调用(Linux 4.11+)获取扩展元数据
statx() 是较新的系统调用,支持按需请求特定字段、规避 NFS 属性缓存问题,并可返回更精确的时间戳(纳秒精度)、挂载 ID、change time 等增强信息,stx_ino 字段提供 inode 编号。
1、包含
2、声明 struct statx sbx;
3、调用 statx(AT_FDCWD, "/path/to/file", AT_STATX_SYNC_AS_STAT, STATX_INO | STATX_SIZE | STATX_MTIME, &sbx);
4、检查返回值及 sbx.stx_mask 是否包含 STATX_INO 位。
5、从 sbx.stx_ino 读取 inode 编号,从 sbx.stx_size、sbx.stx_mtime.tv_nsec 等字段提取扩展元数据。
五、使用 ioctl() 配合 FS_IOC_GETVERSION(仅 ext4/xfs 等支持)
某些文件系统(如 ext4、XFS)支持通过 ioctl 调用 FS_IOC_GETVERSION 获取文件的内部版本号(i_generation),该值与 inode 编号共同构成全局唯一标识,在文件被删除后重建时可用于区分同名 inode。
1、包含
2、以只读方式 open() 目标文件,获取 fd。
3、声明 unsigned int generation;
4、调用 ioctl(fd, FS_IOC_GETVERSION, &generation);
5、若返回 0,则 generation 值即为该 inode 的 generation 字段,需与 st_ino 配合使用以增强唯一性判定。

















