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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:15:45