调用readdir与lstat获取文件修改时间均为程序运行时间问题求解
问题根因
- 代码中
lstat的第一个参数固定为g_cwd(当前工作目录的路径),每次循环都在获取当前工作目录本身的元数据,而非目录下每个遍历到的文件的元数据 - 输出的时间完全一致是因为所有stat操作读取的都是同一个目录的
st_mtime,该时间等于程序运行时间的原因是:修改目录内文件(新增、删除、重命名)都会更新目录本身的mtime,大概率程序运行前后刚好有修改当前目录内容的操作,和readdir、lstat本身修改属性的行为无关,完全符合API规范。
可行解决方案
你需要为每个目录项拼接出完整路径,再传入lstat获取对应文件的元数据,核心逻辑如下:
- 先申请足够长度的缓冲区存储拼接后的完整路径
- 每次循环拿到
entry->d_name后,将其和g_cwd拼接成目标文件的完整路径 - 将拼接后的完整路径传入
lstat获取对应文件的元数据
修正后的核心代码示例:
#include <limits.h> DIR* dir_stream; /* 此处请确认你之前已经正确调用 opendir(g_cwd) 为 dir_stream 完成赋值 */ struct dirent* entry; struct stat buf; errno = 0; char file_path[PATH_MAX]; // 存储拼接后的完整文件路径 for(entry = readdir(dir_stream); entry != NULL; entry = readdir(dir_stream)) { // 跳过.和..两个特殊目录,不需要该逻辑可直接删除 if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; // 拼接目标文件完整路径 snprintf(file_path, sizeof(file_path), "%s/%s", g_cwd, entry->d_name); if(lstat(file_path, &buf) == -1) { fprintf(stderr, "Couldn't obtain info about %s\n%s\n", entry->d_name, strerror(errno)); return -1; } printf("%s %s", entry->d_name, ctime(&buf.st_mtime)); errno = 0; } /*Handle errors and close the stream*/
内容的提问来源于stack exchange,提问作者AJB
相关产品推荐
相关产品推荐

