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

#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;
}

 

转载于:https://www.cnblogs.com/prettyshuang/p/5552277.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值