Linux目录遍历实现 -- 列出当前目录下所有文件

递归遍历目录,列出目录中的文件,代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_PATH 512  //最大文件长度定义为512

/*对目录中所有文件执行print_file_info操作*/
void dirwalk(char *dir, void (*func)(char *))
{
	char name[MAX_PATH];
	struct dirent *dp;
	DIR *dfd;
	
	if((dfd = opendir(dir)) == NULL){
		fprintf(stderr, "dirwalk: can't open %s\n", dir);
		return;
	}
	
	while((dp = readdir(dfd)) != NULL){ //读目录记录项
		if(strcmp(dp->d_name, ".") == 0 || strcmp(dp -> d_name, "..") == 0){
			continue;  //跳过当前目录以及父目录
		}
		
		if(strlen(dir) + strlen(dp -> d_name) + 2 > sizeof(name)){
			fprintf(stderr, "dirwalk : name %s %s too long\n", dir, dp->d_name);
		}else{
			sprintf(name, "%s/%s", dir, dp->d_name);
			(*func)(name);
		}
	}
	closedir(dfd);
}

/*打印文件信息*/
void print_file_info(char *name)
{
	struct stat stbuf;
	
	if(stat(name, &stbuf) == -1){
		fprintf(stderr, "file size: open %s failed\n", name);
		return;
	}
	
	if((stbuf.st_mode & S_IFMT) == S_IFDIR){ 
		dirwalk(name, print_file_info);	 //如果是目录遍历下一级目录
	}else{							
		printf("%8ld    %s\n", stbuf.st_size, name);//不是目录,打印文件size及name
	}
}

int main(int argc, char *argv[])
{
	printf("file size    file name\n");
	if(argc == 1){
		print_file_info(".");//未加参数执行时,从当前目录开始遍历
	}else{
		while(--argc>0){
			print_file_info(*++argv);
		}
	}
	
	return 0;
}

程序运行及执行结果:

yu@ubuntu:~/Linux/206/dirop$ gcc -o dir dir.c 

yu@ubuntu:~/Linux/206/dirop$ ./dir 
file size    file name
    7820    ./dir
    1351    ./dir.c
    
yu@ubuntu:~/Linux/206/dirop$ ./dir /home/yu/Linux/206
file size    file name
    7560    /home/yu/Linux/206/copy
       0    /home/yu/Linux/206/src
    7820    /home/yu/Linux/206/dir
     487    /home/yu/Linux/206/copy.c
    7516    /home/yu/Linux/206/lseek
    7516    /home/yu/Linux/206/llll/lseek
    1025    /home/yu/Linux/206/llll/x
     348    /home/yu/Linux/206/llll/lseek.c
       0    /home/yu/Linux/206/x
      24    /home/yu/Linux/206/dest
     348    /home/yu/Linux/206/lseek.c
    7820    /home/yu/Linux/206/dirop/dir
    1351    /home/yu/Linux/206/dirop/dir.c


Linux目录遍历实现 -- 列出当前目录下所有文件_第1张图片

你可能感兴趣的:(Linux,programming)