c语言遍历某文件夹下的所有文件 包括子文件夹

本文提供了一个使用C语言实现的文件系统遍历示例,通过递归方式打印目录结构,展示了如何打开目录、读取目录条目并判断是否为子目录。此外,还介绍了一种测试函数,用于检查特定的目录条目。




void printdir(char *dir, int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    if( (dp = opendir(dir)) == NULL ){
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
fprintf(stderr,"cannot open directory: %s\n", dir);
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if( S_ISDIR(statbuf.st_mode) ){
            if( strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0 ){
                continue;
            }
            LOGE("%*s%s/\n",depth,"",entry->d_name);
if( strcmp("sys",entry->d_name) == 0 || strcmp("proc",entry->d_name) == 0 ){
//ÎļþÌ«ËûÂèµÄ¶àÁË
                continue;
}
            printdir(entry->d_name,depth+4);
        }else{
            LOGE("%*s%s\n",depth,"",entry->d_name);
}
    }
    chdir("..");
    closedir(dp);
}




static int recovery_test( void ) 
{
    saved_log_file* head = NULL;   
    DIR* d;
    struct dirent* de;
    d = opendir("/");
    if( d ){
        char path[PATH_MAX];
        strcpy(path, "/");
        //strcat(path, "/");
        int path_len = strlen(path);
        while( (de = readdir(d)) != NULL ){
LOGE("de->d_name: %s\n", de->d_name);
            if( strncmp(de->d_name, "last", 4) == 0 ){
                
            }
        }
        closedir(d);
    } else {
        if (errno != ENOENT) {
            LOGE("opendir failed: %s\n", strerror(errno));
        }
    }


    ui->Print("in test\n" );


printdir("/",0);
    return 0;
}
<think>我们被要求使用C语言实现遍历文件夹下所有文件路径的方法。根据提供的引用内容,特别是引用[2]和引用[3],我们可以看到一个递归遍历文件夹的示例。引用[2]展示了如何递归遍历文件夹打印文件名,引用[3]则提到了获取文件夹下所有文件名的函数框架。我们的目标是获取所有文件的完整路径。 我们将设计一个递归函数来遍历给定路径下的所有文件子文件夹。在遍历过程中,我们需要跳过当前目录(".")和上级目录(".."),以避免无限循环。对于每个文件,我们将打印或保存其完整路径。对于子文件夹,我们将递归调用遍历函数。 注意:不同的操作系统有不同的API。引用[2]使用的是Windows环境(路径使用"D:\\test"),但代码中使用了`dirent.h`,这是POSIX标准的头文件,在Linux和Windows(通过MinGW等)都可以使用。为了跨平台,我们使用标准POSIX的目录遍历函数。 步骤: 1. 包含必要的头文件:<stdio.h>(标准输入输出)、<dirent.h>(目录操作)、<string.h>(字符串操作)、<sys/stat.h>(文件状态,用于判断是文件还是目录)。 2. 编写递归函数,该函数接收一个基础路径(当前要遍历的目录路径)。 3. 打开目录(opendir),如果打开失败则返回(可能是文件或无法访问)。 4. 循环读取目录中的每一项(readdir),跳过"."和".."。 5. 构建当前项的完整路径(基础路径+文件名)。 6. 判断当前项是文件还是目录(使用stat函数): - 如果是目录,则递归调用遍历函数。 - 如果是文件,则输出完整路径(或保存起来)。 7. 关闭目录(closedir)。 但是,引用[2]的代码中没有区分文件和目录,而是对每个非"."和".."的项都尝试递归,这可能会导致问题(因为文件无法递归打开)。因此,我们需要修改为判断类型。 另外,我们可能希望将文件路径保存起来,而不仅仅是打印。我们可以使用动态数组或链表来存储,但用户问题只要求获取路径,我们可以先实现打印所有文件路径的功能。 下面我们实现一个程序,打印给定目录下所有文件的完整路径(包括目录中的文件)。 注意:由于目录树可能很深,递归时要注意栈溢出问题。但对于一般使用,递归是简单有效的方法。 代码示例: </think> ### C语言遍历文件夹下所有文件路径的方法 在C语言遍历文件夹及其子文件夹获取所有文件路径,通常采用递归方法结合POSIX标准目录操作函数(`<dirent.h>`)。以下是详细实现步骤和代码示例: #### 核心步骤 1. **包含头文件** 使用`<dirent.h>`处理目录流,`<sys/stat.h>`判断文件类型,`<string.h>`处理路径拼接。 2. **递归遍历函数** - 打开目录流(`opendir()`) - 逐项读取目录内容(`readdir()`) - 跳过特殊目录`.`和`..` - 拼接完整路径(`strcpy()` + `strcat()`) - 判断文件类型(`stat()` + `S_ISREG`/`S_ISDIR`) - 递归处理目录 3. **内存管理** 动态数组存储路径,避免固定缓冲区溢出风险。 #### 完整代码实现 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> // 递归遍历目录的函数 void traverse_directory(const char *base_path) { DIR *dir = opendir(base_path); if (!dir) { perror("无法打开目录"); return; } struct dirent *entry; while ((entry = readdir(dir)) != NULL) { // 跳过当前目录(.)和上级目录(..) if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } // 构建完整路径 char path[1024]; snprintf(path, sizeof(path), "%s/%s", base_path, entry->d_name); struct stat statbuf; if (stat(path, &statbuf) == -1) { perror("获取文件信息失败"); continue; } if (S_ISREG(statbuf.st_mode)) { // 普通文件 printf("文件: %s\n", path); } else if (S_ISDIR(statbuf.st_mode)) { // 目录 printf("目录: %s\n", path); traverse_directory(path); // 递归遍历目录 } } closedir(dir); } int main() { const char *root_path = "/path/to/your/directory"; // 替换为目标目录 traverse_directory(root_path); return 0; } ``` #### 关键说明 1. **路径拼接** 使用`snprintf`确保路径不溢出缓冲区,比`strcpy/strcat`更安全。 2. **文件类型判断** - `S_ISREG()`:检测是否为普通文件 - `S_ISDIR()`:检测是否为目录 3. **特殊目录处理** 显式跳过`.`和`..`避免递归死循环。 4. **错误处理** 使用`perror()`输出错误信息,增强健壮性。 #### 注意事项 1. **路径长度限制** 缓冲区`path[1024]`可根据需要调整,或改用动态内存分配。 2. **符号链接处理** 如需跟踪符号链接,需使用`lstat()`替代`stat()`单独处理。 3. **性能优化** 深度嵌套目录可能引发栈溢出,可改用迭代+栈结构(非递归BFS)[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值