C目录操作

该博客介绍了如何使用C语言的系统调用遍历指定路径下的文件夹内容,包括递归遍历子文件夹。`opendir`、`readdir`和`fstatat`等函数被用于读取和检查目录项。代码示例展示了如何打印文件夹内的所有文件和子文件夹名称,并通过`RecursiveReadfolder2`实现递归读取。

C语言读取文件夹内容

    char dirPath[] ="/home/xxxx/TestFiles/chapeter4";
    DIR* dir = opendir(dirPath);
    struct dirent * dirent = readdir(dir);
    while (dirent != NULL) {
        printf("%s\n",dirent->d_name);
        dirent = readdir(dir);
    }

C语言遍历文件夹

void printNChar(int n){
    int i;
    for(i = 0 ; i < n ;i++){
        printf("-");
    }
}
/**
 * @brief RecursiveReadfolder2
 * @param n
 * @param fd
 * @param name
 */
void RecursiveReadfolder2(int n,int fd,const char* name){
    struct stat buf;
    if(fstatat(fd,name,&buf,AT_SYMLINK_NOFOLLOW)<0){
        return;
    }
    if(S_ISDIR(buf.st_mode)){

        int subfd = openat(fd,name,O_DIRECTORY|O_NOFOLLOW);
        DIR* dir = fdopendir(subfd);
        struct dirent * dirent  = NULL;
        while ((dirent = readdir(dir)) != NULL) {
            printNChar(n);
            printf("%s\n",dirent->d_name);
            if(strcmp(dirent->d_name,".") != 0 && strcmp(dirent->d_name,"..") != 0)
                RecursiveReadfolder2(n+2,subfd,dirent->d_name);
        }
    }/*else{
        printNChar(n);
        printf("%s\n",name);
    }*/

}


void RecursiveReadfolder(const char* path){
    struct stat buf;
    int n=2;
    if(lstat(path,&buf)<0){
        return;
    }
    printf("%s\n",path);
    if(S_ISDIR(buf.st_mode)){
        int fd = open(path,O_DIRECTORY);
        DIR* dir = fdopendir(fd);
        struct dirent * dirent = NULL;
        while ((dirent = readdir(dir)) != NULL) {
            printNChar(n);
            printf("%s\n",dirent->d_name);
            if(strcmp(dirent->d_name,".") != 0 && strcmp(dirent->d_name,"..") != 0)
                RecursiveReadfolder2(n+2,fd,dirent->d_name);
        }
    }/*else{
        printNChar(n);
        printf("%s\n",path);
    }*/

}
<think>好的,用户想了解C语言中如何进行目录操作,并需要示例代码。首先,我需要回忆C语言中处理目录的相关函数和头文件。通常,目录操作涉及创建、删除、读取目录内容等。在C标准库中,处理目录的函数主要在<dirent.h>中,比如opendir、readdir、closedir等。对于创建和删除目录,可能需要使用系统特定的函数,比如在POSIX系统中用mkdir和rmdir,这些函数在<sys/stat.h>和<unistd.h>中声明。 用户可能需要跨平台的示例,但考虑到C语言的标准库本身不直接提供创建目录的函数,通常需要依赖操作系统特定的API。比如在Windows下,可能会使用_mkdir,而在Linux下用mkdir。这里可能需要指出平台差异,并提供相应的代码示例。 接下来,我需要检查用户提供的引用内容。用户给出的引用[1]是关于C语言基础代码示例,包括打印ASCII表。虽然这和目录操作无关,但可能需要确保示例代码的正确性和兼容性。因此,在编写示例时,应该包含必要的头文件,并处理可能的错误情况,比如检查目录是否创建成功,或者读取目录时的权限问题。 用户可能需要创建目录、删除目录、遍历目录中的文件等操作的示例。例如,创建目录可以使用mkdir函数,删除用rmdir,遍历则用opendir和readdir。需要注意的是,删除目录目录必须为空,否则可能需要先删除其中的文件。 另外,错误处理也很重要,比如检查mkdir的返回值,使用perror输出错误信息。同时,在遍历目录时,需要跳过.和..这两个特殊目录项,以避免处理不必要的条目。 还需要考虑跨平台的问题,比如在Windows和Linux下的不同函数调用和头文件。不过由于用户没有指定平台,可能需要分别给出示例或说明两者的差异。 最后,生成相关问题,可能涉及更高级的目录操作,比如递归遍历目录、检查目录属性等,或者如何处理不同操作系统的兼容性问题。</think>在C语言中进行目录操作需要借助标准库和系统调用函数,以下是三个常用功能的实现示例: ### 一、创建目录 ```c #include <stdio.h> #include <sys/stat.h> // mkdir() #include <stdlib.h> int main() { const char* dirname = "new_folder"; if (mkdir(dirname, 0777) == 0) { printf("目录创建成功\n"); } else { perror("创建失败"); exit(EXIT_FAILURE); } return 0; } ``` 说明:`mkdir()`第二个参数指定目录权限模式,Linux系统采用八进制权限表示法[^1] ### 二、遍历目录内容 ```c #include <stdio.h> #include <dirent.h> int main() { DIR *dir; struct dirent *entry; if ((dir = opendir(".")) == NULL) { perror("无法打开目录"); return 1; } while ((entry = readdir(dir)) != NULL) { printf("%s\n", entry->d_name); } closedir(dir); return 0; } ``` 注意:该程序会输出包含`.`(当前目录)和`..`(上级目录)的所有条目 ### 三、删除空目录 ```c #include <stdio.h> #include <unistd.h> // rmdir() int main() { const char* dirname = "empty_dir"; if (rmdir(dirname) == 0) { printf("目录删除成功\n"); } else { perror("删除失败"); } return 0; } ``` 注意:被删除目录必须为空,否则需要使用递归文件删除[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值