Linux 下C编程实现文件夹下文件大小和二级文件夹大小统计

时间:2017年12月29日

环境Linux+编译器gcc

问题记录1:

最近在搞统计目录下文件和文件大小的实现,一开始上博客以及上网找相应的demo,找到一些,但大都只是统计当前文件夹下文件的总大小,即没有统计当前文件以及二级文件夹的能力,所以自己弄了一个能够实现当前目录下二级目录的大小统计。


问题记录2:关于stat函数问题

首先还是贴一下stat函数的原型吧,如下。

表头文件:    #include <sys/stat.h>
                   #include <unistd.h>
定义函数:    int stat(const char *file_name, struct stat *buf);
函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
返回值:      执行成功则返回0,失败返回-1,错误代码存于errno

好了,开始说问题了:

使用Linux下stat文件属性函数时,如果你直接把文件名传入stat函数,这时他只会在当前,即程序所在目录下进行查找该文件,如果找不到那么将失败,因此,如果你是想通过这个程序去统计其它文件夹里面的文件,这时需要将那个文件的全路径传给stat函数,这样就不会出错了。

说了这么多贴一下代码,大家一起分享一下吧:

#include <stdio.h> 
#include <dirent.h> 
#include <string.h>
#include <sys/types.h>
#include <stdbool.h>
#include <sys/stat.h> 


void main(int argc,char **argv)
{
int caculatefilesize(char *path,bool ischilddir);
bool ischilddir =false;


if(argc<2)
{
printf("Usage:%s + %s\n",argv[0],argv[1]);
return;
}
caculatefilesize(argv[1],ischilddir);
}


int caculatefilesize(char *path,bool ischilddir)
{
DIR *ptr; 
struct stat buf; 
  struct dirent *dir; 
 
bool childDirflag=false;
char pathname[60];
char pathnametmp[60];


int pathNamelen=sizeof(pathname);
  int total_size=0; 
  int len =0; 


if((ptr = opendir(path))==NULL)
{
printf("Open dir failed!\n");
return -1;
}

strcpy(pathnametmp,path);
strcat(pathnametmp,"/");


for (dir = readdir(ptr); dir != NULL; dir = readdir(ptr)) 
{
if(!strcmp(".",dir->d_name)||!strcmp("..",dir->d_name)) 
continue;
memset(pathname,0,pathNamelen);
strcpy(pathname,pathnametmp);
strcat(pathname,dir->d_name);

if(stat(pathname, &buf)<0)
{
printf("Couldn't stat %s\n", dir->d_name); 
continue;
}


if(S_ISDIR(buf.st_mode))
{
childDirflag =true;
total_size =caculatefilesize(pathname,childDirflag);
printf("the size:%dByte filename:%s\n",total_size,pathname);
continue;
}
if(ischilddir)
{
len = buf.st_size;
total_size +=len;
}
else 
{
len = buf.st_size;
printf("the size:%dByte filename:%s\n",len,dir->d_name); 
}
}
closedir(ptr);
return total_size;
}

以上只是能够查找二级文件夹(二级文件夹下没有下一级文件夹)大小,可继续改进。

over!



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值