#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);
}
linux文件夹大小计算<递归>
于 2022-01-04 14:58:00 首次发布