c++怎么在Linux下获取文件最后一次被修改的纳秒级时间戳【实战】
用stat()读取纳秒级mtimest_mtim.tv_nsec仅在支持纳秒的文件系统ext4/xfs上有效需检查返回值和errno避免使用struct stat64、std::filesystem::last_write_time()及直接tv_sec*1e9tv_nsec防溢出。用 stat() 读取纳秒级 mtime别信 ctime 或 atimeLinux 下只有 stat() 系统调用能拿到纳秒精度的修改时间st_mtim.tv_nsecctime 是状态变更时间atime 是访问时间和“最后修改”无关。glibc 的 struct stat 在支持纳秒的文件系统ext4、xfs 等上会填充 st_mtim.tv_nsec 字段但老内核或某些挂载选项如 noatime不影响 mtime 精度。实操建议立即学习“C免费学习笔记深入”必须用 struct stat 而不是 struct stat64后者在部分平台不保证纳秒字段存在检查 st_mtim.tv_nsec 是否有效它可能为 0比如 ext2 或某些 NFS 服务端不支持纳秒不要用 std::filesystem::last_write_time()C17——它只返回 std::file_time_type底层精度取决于实现GCC libstdc 默认截断到秒或微秒不可靠stat() 返回值和 errno 判断比 try-catch 更实在在 C 里调用 stat() 是纯 C 风格系统调用没有异常机制。常见错误不是“没权限”而是路径不存在、符号链接悬空、或者跨文件系统挂载导致 stat() 失败。直接检查返回值和 errno 最稳。实操建议立即学习“C免费学习笔记深入”始终检查 stat() 返回值是否为 0非零就看 errno比如 ENOENT文件不存在、EACCES无权限、ENOTDIR路径中间某层不是目录别用 throw 包一层再 catch——这掩盖了真正的系统错误语义如果路径是相对路径注意当前工作目录可能被其他线程/信号改变建议提前用 getcwd() 记录或转为绝对路径纳秒时间戳拼接要防溢出别直接用 tv_sec * 1000000000LL tv_nsecst_mtim.tv_sec 是 time_t通常是 64 位有符号整数tv_nsec 是 long通常 32 位范围 0–999999999。直接乘加看似简单但 tv_sec 很大时比如公元 2200 年tv_sec * 1000000000LL 可能溢出 long long。 Mokker AI AI产品图添加背景