#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<glob.h>
#define PATHSIZE 1024
//判断是否是在 . 还是 .. 防止mydu进入死循环
static int path_noloop(const char *path)
{
char *pos;
pos = strrchr(path,'/');
if(pos == NULL)
{
return 0;
}
if(strcmp(pos + 1,".") == 0 || strcmp(pos+1,"..") == 0)
{
return 0;
}
return 1;
}
static int64_t mydu(const char *path)
{
static struct stat statres;
static char nextpath[PATHSIZE];
glob_t globrest;
int64_t sum ; //解析到的文件的block大小总值
int ret = 0,i;
if(lstat(path,&statres) < 0)
{
perror("lstat()");
exit(1);
}
if(!S_ISDIR(statres.st_mode)) //如果是目录文件就直接返回block大小
{
return statres.st_blocks * 512 / 1024;
}
//把非隐藏的文件都解析到了globrest中
strncpy(nextpath,path,PATHSIZE);
strncat(nextpath,"/*",PATHSIZE);
ret = glob(nextpath,0,NULL,&globrest);
if(ret)
{
printf("Error code = %d\n",ret);
exit(1);
}
strncpy(nextpath,path,PATHSIZE);
strncat(nextpath,"/.*",PATHSIZE);
//将解析到的隐藏文件追加到globrest中
ret = glob(nextpath,GLOB_APPEND,NULL,&globrest);
if(ret)
{
printf("Error code1 = %d\n",ret);
exit(1);
}
sum = statres.st_blocks;
for(i = 0;i < globrest.gl_pathc;i++)
{
if(path_noloop(globrest.gl_pathv[i]))
{
//递归将glorest中的文件block数累加
sum += mydu(globrest.gl_pathv[i]);
}
}
globfree(&globrest);
return sum * 512 / 1024;
}
int main(int argc,char **argv)
{
if(argc < 2)
{
fprintf(stderr,"Usage.....\n");
exit(1);
}
printf("%ld KB\t %s\n",mydu(argv[1])/2,argv[1]);
exit(1);
}
请问为什么要查看其他目录时会报错。
请各位帮忙解释一下,看半天看不出个所以然