首页 > 代码库 > Linux C 读取文件夹下所有文件(包括子文件夹)的文件名(转)

Linux C 读取文件夹下所有文件(包括子文件夹)的文件名(转)

Linux C  下面读取文件夹要用到结构体struct dirent,在头#include <dirent.h>中,如下:

1 #include <dirent.h>
2 struct dirent
3 {
4    long d_ino; /* inode number 索引节点号 */
5    off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
6    unsigned short d_reclen; /* length of this d_name 文件名长 */
7    unsigned char d_type; /* the type of d_name 文件类型 */
8    char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
9 }

其中d_type表明该文件的类型:文件(8)、目录(4)、链接文件(10)等。

下面程序,递归读取某文件夹及其子文件夹下所有文件名:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
int readFileList(char *basePath)
{
    DIR *dir;
    struct dirent *ptr;
    char base[1000];

    if ((dir=opendir(basePath)) == NULL)
    {
        perror("Open dir error...");
        exit(1);
    }

    while ((ptr=readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0)    ///current dir OR parrent dir
            continue;
        else if(ptr->d_type == 8)    ///file
            printf("d_name:%s/%s\n",basePath,ptr->d_name);
        else if(ptr->d_type == 10)    ///link file
            printf("d_name:%s/%s\n",basePath,ptr->d_name);
        else if(ptr->d_type == 4)    ///dir
        {
            memset(base,\0,sizeof(base));
            strcpy(base,basePath);
            strcat(base,"/");
            strcat(base,ptr->d_name);
            readFileList(base);
        }
    }
    closedir(dir);
    return 1;
}

int main(void)
{
    DIR *dir;
    char basePath[1000];

    //get the current absoulte path
    memset(basePath,\0,sizeof(basePath));
    getcwd(basePath, 999);
    printf("the current dir is : %s\n",basePath);

    //get the file list
    //memset(basePath,‘\0‘,sizeof(basePath));
    //strcpy(basePath,"./XL");
    readFileList(basePath);
    return 0;
}

执行输出 :

技术分享

 

Linux C 读取文件夹下所有文件(包括子文件夹)的文件名(转)