思路
- 判断命令行参数,获取用户要查询的目录名。
- 判断用户指定的是否是目录。 S_ISDIR()
- 读目录:
- 普通文件:直接打印
- 目录:
- 拼接目录访问绝对路径。
- 递归调用自己。
函数解释 (02)
1、stat(const char *path, struct stat *buf);
参数一:文件名
参数二:inode结构体指针(传出参数)
文件属性通过传出参数返回给调用者
实现
#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);
void read_dir(char *dir){
char path[260]; //存放绝对路径
DIR *dp;
struct dirent *sdp;
dp = opendir(dir);
if(dp == NULL){
perror("opendir error");
return ;
}
while((sdp = readdir(dp)) != NULL){
if(strcmp(sdp->d_name, ".") == 0 || strcmp(sdp->d_name, "..") == 0){
continue;
} //防止无限递归
//因为sdp->d_name得到的是相对路径,所以需要拼接
sprintf(path, "%s/%s", dir, sdp->d_name);
isFile(path);
}
closedir(dp);
return ;
}
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);
} else {
printf("%30s\t%ld\n", name, sb.st_size);
}
return ;
}
int main(int argc, char *argv[]){
if(argc == 1){ //没有传入参数
isFile(".");
} else {
isFile(argv[1]);
}
}