发布于2026-07-17 阅读(0)
扫一扫,手机访问
在实际开发中,遍历目录并获取文件信息是常见的需求,比如做文件监控、增量备份、或者简单的文件列表整理。不少朋友一上来就想到用readdir,但readdir只负责把目录里的条目列出来,至于每个文件的最后修改时间、大小、权限这些元数据,它一概不管。这时候就得请出stat函数来帮忙了。

下面这段代码就是一个很典型的配合示例,把readdir和stat结合起来,遍历当前目录,并打印出每个文件的最后修改时间:
#include
#include
#include
#include
#include
int main() {
DIR *dir;
struct dirent *entry;
struct stat file_stat;
dir = opendir("."); // 打开当前目录
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
while ((entry = readdir(dir)) != NULL) {
// 跳过当前目录和上级目录的特殊条目
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
// 构建文件的完整路径
char file_path[PATH_MAX];
snprintf(file_path, sizeof(file_path), "./%s", entry->d_name);
// 获取文件的stat信息
if (stat(file_path, &file_stat) == -1) {
perror("stat");
continue;
}
// 将最后修改时间转换为可读格式
char time_str[26];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", localtime(&file_stat.st_mtime));
printf("File: %s\n", entry->d_name);
printf("Last modified: %s\n", time_str);
}
closedir(dir);
return EXIT_SUCCESS;
}
代码的逻辑很清晰:先打开目录(这里用了当前目录,实际使用时可以换成任意路径),然后循环读取每一个条目。注意,一定要跳过.和..这两个特殊目录,否则它们也会被当作普通文件处理,导致不必要的麻烦。接着,用snprintf拼出完整的文件路径,再调用stat获取文件信息。如果stat失败(比如文件被删除或权限不足),直接跳过继续处理下一个。
获取到struct stat后,st_mtime字段里存放的就是最后修改时间,以Unix时间戳的形式(从1970年1月1日开始的秒数)。通过localtime和strftime,很容易就能转换成2025-04-21 14:30:00这种人类友好格式。最后打印出来,一个简单的文件时间列表就完成了。
这里有个小细节值得留意:PATH_MAX是系统定义的最大路径长度,不同平台可能略有差异。如果路径特别长,建议用动态分配或者更安全的realpath来处理。另外,readdir返回的d_name只包含文件名,不包含路径,所以构建完整路径是必须的,否则stat会找不到文件。
总而言之,readdir负责“列出谁在这里”,stat负责“告诉我这个人的详细信息”,两者配合,就能把目录下的文件信息摸个底朝天。
上一篇:readdir如何按文件类型排序
下一篇:如何限制SSH登录用户数量
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8