您的位置:首页 > 产品设计 > UI/UE

apue编程之参考du代码利用递归写的一个简单的du命令的源代码

2014-07-10 10:00 585 查看
#include <stdio.h>
#include <stdlib.h>
#include <glob.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define PATHSIZE 1024

static int path_noloop(const char *path)
{
char *pos;

pos = strrchr(path,'/');//定位最右边的'/'的位置

if(strcmp(pos+1,".") == 0 || (strcmp(pos+1,"..") == 0))
return 0;
return 1;

}

static int64_t mydu(const char *path)
{
int i;
glob_t globres;
int64_t sum;
static struct stat statres;
static char nextpath[PATHSIZE];

if(lstat(path, &statres) < 0)
{
perror("lstat()");
return 0;//exit(1);
}

if(!S_ISDIR(statres.st_mode))
return statres.st_blocks;

strncpy(nextpath, path,PATHSIZE);
strncat(nextpath, "/*" , PATHSIZE);
glob(nextpath,GLOB_NOSORT, NULL, &globres);

strncpy(nextpath, path,PATHSIZE);
strncat(nextpath, "/.*" , PATHSIZE);
glob(nextpath,GLOB_NOSORT|GLOB_APPEND, NULL, &globres);

sum = statres.st_blocks;

for(i = 0 ;i < globres.gl_pathc ; i++)
{
if(path_noloop(globres.gl_pathv[i]))
sum += mydu(globres.gl_pathv[i]);
}

return sum;
}

int main(int argc,char **argv)
{
if(argc < 2)
{
fprintf(stderr,"Usage...\n");
exit(1);
}

printf("%lld 512B blocks\n",mydu(argv[1]));

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  apue du linux 编程
相关文章推荐