Linux C语言遍历目录结构

时间:2021-12-13 12:31:46

  遍历目录结构查找文件是很常用的功能,今天介绍一下使用Linux C 遍历Linux目录结构的方法:

   linux提供几个系统调用,以便于直接目录的读取和操作:

  DIR * opendir(const char * pathname);

  struct dirent * readdir(DIR * dir_handle);

  int closedir(DIR * dir);

  int stat(const char *file_name, struct stat *buf);

 

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
#include <dirent.h>          //包含目录操作的相关函数

/**
* @Param pathname 要遍历的目录全路径名称
* @Param depth 当前的遍历等级,初始为0
*/
void printdir(const char * pathname, const int depth) { DIR * dir; struct dirent * de; struct stat fs; int i = 0; if((dir = opendir(pathname)) == NULL) { printf("open dir %s error \r\n", pathname); return; } chdir(pathname); while((de = readdir(dir)) != NULL) { if(strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0){continue;} if(stat(de->d_name, &fs) == -1){perror("fstat error");continue;} if(S_ISDIR(fs.st_mode)) {
              /**
               * 如果当前路径是目录,就递归调用printdir函数
              */ for(i=0;i<depth;++i){printf(" ");} printf("%s\r\n", de->d_name); printdir(de->d_name, depth + 4); } else { for(i=0;i<depth;++i) { printf(" "); } printf("%s\r\n", de->d_name); } }
chdir(".."); closedir(dir); return; } int main(int argc, char ** argv) { printdir("/root/projects", 0); return 0; }

 

Linux 自带的目录遍历函数

int scandir(const char *dir,struct dirent **namelist,int (*filter)(const void *b),

int ( * compare )( const struct dirent **, const struct dirent ** ) );
int alphasort(const void *a, const void *b);
int versionsort(const void *a, const void *b);

 具体函数使用方法见man