linux文件夹大小计算<递归>

#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <libgen.h>
#include <string.h>
#include <stdlib.h>

/*
仅仅计算 d_type == DT_REG 的文件大小
文件绝对路径名超过1024 的统计
/a/b/c ...   1024*512 内存空间
*/

unsigned long _dirsize(char *dir_name,char *base_name)
{
    unsigned long size = 0;
	struct stat filestatus;
	char *name = NULL;

	if(strlen(dir_name) + strlen(base_name) +1 > 1024)
	{
		return 0;
	}

	name = malloc(1024);
	if(name == NULL )
	{
		return 0;
	}
	
	snprintf(name,1024,"%s/%s",dir_name,base_name); 
    DIR *dir=opendir(name);
    if(dir==NULL)
    {
    	free(name);
		return 0;
    }
	
    struct dirent *ptr=NULL;
    while((ptr = readdir(dir))!=NULL)
    {
    	
		if( (0==strcmp(ptr->d_name,".")) || (0==strcmp(ptr->d_name,".."))  )
		{
		    continue;
		}
		
		if(ptr->d_type == DT_DIR )
		{
			snprintf(name,1024,"%s/%s",dir_name,base_name);
			size += _dirsize(name,ptr->d_name);
		}		
		else if(ptr->d_type == DT_REG)
		{
			snprintf(name,1024,"%s/%s/%s",dir_name,base_name,ptr->d_name);
			if(0==stat(name,&filestatus))
			{
			    //printf("%08d :%s\n",filestatus.st_size,name);
				size += filestatus.st_size;
			}
		}	
    }

	closedir(dir);
	free(name);
	return size;
}


unsigned long dirsize(char *pathname)
{
	char tmp[1024];
    char tmp1[1024];
	strncpy(tmp,pathname,1024);
    strncpy(tmp1,pathname,1024);
	unsigned long size = _dirsize(dirname(tmp1),basename(tmp));
}


int main(int argc, char *argv[])
{
	unsigned long size = 0;
	printf("\n\n\n");
	struct timeval tv0;
    gettimeofday(&tv0, NULL);
	
	size = dirsize(argv[1]);
	
	struct timeval tv1;
    gettimeofday(&tv1, NULL);
	
	printf("All size is : %d; time=%d\n",size,tv1.tv_usec - tv0.tv_usec);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值