一、递归目录分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/77dde452d0f1bd01b4c062f77e9964b9.png)
2,实现
#include<stdio.h>
#include<stdlib.h>
#include<string,h>
#include<unistd.h>
#include<pthread.h>
#include<sys/stat.h>
#include<dirent.h>
void isFile(char *name)
{
int ret = 0;
struct stat sb;
ret = stat(name, &sb);
if(ret == -1)
{
perror("stat error");
return;
}
if(S_ISDIR(sb.st_mode))
{
read_dir(name);
}
printf("%s\t%ld\n",name,sb.st_size);
return;
}
void read_dir(char *dir)
{
char path[256];
DIR *dp;
struct dirent *sdp;
dp = opendir(dir);
if(dp == NULL)
{
perror("opendir error");
return;
}
while(sdp = readdir(dp))
{
if(strcmp(sdp->d_name,".") == 0 ||strcmp(sdp->d_name,"..") == 0)
{
continue;
}
sprintf(path, "%s/%s", dir, sdp->d_name);
isFile(path);
}
closedir(dp);
return;
}
int main(int argc, char*argv[])
{
if(argc == 1){
isFile(".");
}else{
isFile(argv[1]);
}
return 0;
}
- 主函数中,判断命令行参数,没有的话就自动给当前目录".",有的话就去判断是否是目录(isFile)
- isFile文件判断文件类型,用stat函数获取文件属性,如果是普通文件就直接打印(名字+大小),是目录文件就到目录函数中再处理read_dir
- read_dir:打开目录,读取目录,处理目录,重点就是读取目录,再将读到的目录项判断其文件属性用isFile(),要注意的是往isFile传入参数的时候要传入绝对路径,用sprintf函数借助一个缓冲区,缓冲区大小最大是256,是操作系统规定的最大文件路径长度