统计指定目录下普通文件的个数,要求递归子目录
$find ./ -type f |wc -l
打开目录
DIR *opendir(const char name);
name打开的目录
返回值 返回DIR的指针,指向目录项的信息
读目录
struct dirent *readdir(DIR *dirp);
dirp传入参数,opendir返回的指针
返回值:NULL代表读到末尾或者有错误
读到目录项的内容
关闭目录
int closedir(DIR *dirp)
dirp opendir得到的DIR指针
filecount.c
#include<stdio.h>
#include<unistd.h>
#include<dirent.h>
#include<sys/types.h>
#include<string.h>
int count=0;//定义一个全局计数
int DirCount(char *dirname)
{
//打开目录
DIR *dirp=opendir(dirname);
if(dirp==NULL){
perror("opendir err");
return -1;
}
//循环读目录,如果是普通文件,count++,如果是目录递归调用DirCount
struct dirent *dentp=NULL;
while((dentp=readdir(dirp))!=NULL){ //如果为NULL代表读到目录末尾
//printf("dirname %s dtype:%d\n",dentp->d_name,dentp->d_type);
if(dentp->d_type==DT_DIR){ //如果是目录
if(strcmp(".",dentp->d_name==0||strcmp("..",dentp->d_name==0){
continue; //如果是.或者..直接跳过
}
//注意进程的工作路径,不能直接打开子目录
//使用dirname拼接下一级子目录
char newdirname[256]={0};
sprintf(newdirname,"%s %s",dirname,dentp->d_name);
DirCount(newdirname);
}
if(dento->d_type==DT_REG){
//普通文件则开始计数
count++;
printf("dname:%s\n",dentp->d_name);
}
}
//关闭目录
close(dirname);
return 0;
}
int main(int argc,char *argv[])
{
if(argc!=2){
printf("./a.out dirname\n");
return -1;
}
DirCount(argv[1]);
return 0;
}