You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用readdir与lstat获取文件修改时间均为程序运行时间问题求解

问题根因

  • 代码中lstat的第一个参数固定为g_cwd(当前工作目录的路径),每次循环都在获取当前工作目录本身的元数据,而非目录下每个遍历到的文件的元数据
  • 输出的时间完全一致是因为所有stat操作读取的都是同一个目录的st_mtime,该时间等于程序运行时间的原因是:修改目录内文件(新增、删除、重命名)都会更新目录本身的mtime,大概率程序运行前后刚好有修改当前目录内容的操作,和readdir、lstat本身修改属性的行为无关,完全符合API规范。

可行解决方案

你需要为每个目录项拼接出完整路径,再传入lstat获取对应文件的元数据,核心逻辑如下:

  1. 先申请足够长度的缓冲区存储拼接后的完整路径
  2. 每次循环拿到entry->d_name后,将其和g_cwd拼接成目标文件的完整路径
  3. 将拼接后的完整路径传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:06:10