如何在C语言中传递打开的目录至函数以查找最新/最旧修改文件
C语言目录处理:传递目录句柄与查找最旧修改文件
一、传递打开的目录句柄给自定义函数
直接将DIR*类型的目录句柄作为参数传入自定义函数即可,注意要在调用自定义函数之后再调用closedir(),否则句柄会失效。
二、实现查找最旧修改文件的功能
核心步骤:
- 遍历目录时跳过
.和..两个特殊目录 - 拼接文件的完整路径(目录路径 + 文件名)
- 调用
stat()获取文件的修改时间st_mtime - 维护变量记录当前最旧文件的路径和修改时间,遍历中不断比较更新
三、完整修正后的代码
#include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <sys/stat.h> #include <sys/types.h> #include <string.h> // 声明自定义函数,避免编译警告 void getFileModTime(const char *path); char* findOldestFile(DIR *d, const char *dir_path); int main(int argc, char* argv[]) { DIR *d; if(argc == 2){ const char* path = argv[1]; d = opendir(path); if (d) { // 调用自定义函数,传递打开的目录句柄和目录路径 char* oldest_file = findOldestFile(d, path); if (oldest_file) { printf("\n最旧的修改文件是:%s\n", oldest_file); getFileModTime(oldest_file); free(oldest_file); // 释放动态分配的内存 } else { printf("目录中没有可统计的文件\n"); } closedir(d); // 最后关闭目录句柄 } else { perror("无法打开目录"); return 1; } return 0; } else { printf("参数错误:请传入一个目录路径\n"); return 1; } } // 获取文件修改时间 void getFileModTime(const char *path) { struct stat attr; if (stat(path, &attr) == -1) { perror("获取文件信息失败"); return; } printf("最后修改时间:%s", ctime(&attr.st_mtime)); } // 查找目录中最旧的修改文件 char* findOldestFile(DIR *d, const char *dir_path) { struct dirent *entry; char* oldest_path = NULL; time_t oldest_mtime = -1; // 遍历目录条目 while ((entry = readdir(d)) != NULL) { // 跳过特殊目录 if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } // 拼接文件完整路径 size_t path_len = strlen(dir_path) + strlen(entry->d_name) + 2; // +2 是为了 '/' 和 '\0' char* full_path = malloc(path_len); if (!full_path) { perror("内存分配失败"); continue; } snprintf(full_path, path_len, "%s/%s", dir_path, entry->d_name); // 获取文件信息 struct stat attr; if (stat(full_path, &attr) == -1) { perror("获取文件信息失败"); free(full_path); continue; } // 判断是否为普通文件(跳过目录等特殊文件) if (!S_ISREG(attr.st_mode)) { free(full_path); continue; } // 比较修改时间,更新最旧文件记录 if (oldest_mtime == -1 || attr.st_mtime < oldest_mtime) { oldest_mtime = attr.st_mtime; // 释放之前的旧路径(如果有) if (oldest_path) { free(oldest_path); } oldest_path = full_path; } else { free(full_path); } } return oldest_path; }
四、关键细节说明
- 目录句柄传递:
DIR*是指向目录流的指针,直接作为函数参数传递即可,函数内部通过它调用readdir()遍历目录。 - 完整路径拼接:
stat()需要文件的完整路径才能正确获取信息,不能仅传递文件名,因此需要将目录路径与文件名拼接。 - 内存管理:动态分配的路径内存需要在使用完后释放,避免内存泄漏。
- 错误处理:增加了
opendir()、stat()、malloc()的错误检查,提升程序健壮性。 - 特殊文件过滤:跳过
.、..目录,并且只处理普通文件(通过S_ISREG()判断),避免统计目录或其他特殊文件。
内容的提问来源于stack exchange,提问作者Lauren S
相关产品推荐
相关产品推荐

