(linux系统)获取目录及目录下文件所占磁盘大小

it2024-03-26  49

运行结果

代码

#include<stdio.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <glob.h> #include <string.h> #define PATHSIZE 1024 static int path_noloop(const char * path) { //aa/bb/cc/..or. //strrchar()//在字符串中找到最右面的字符 char *pos; pos= strrchr(path,'/'); if(pos==NULL) { exit(1); } if(strcmp(pos+1,".")==0||strcmp(pos+1,"..")==0) return 0; return 1; } //该函数会用到递归,所以可以对变量进行优化, //只在递归点前出现的变量可以优化到静态去。。 static int64_t mydu(const char *path) { static struct stat statres; static char nextpath[PATHSIZE]; glob_t globres; int i; int64_t sum; if(lstat(path,&statres)<0) { perror("lstat()"); exit(1); } //非目录文件 if(!S_ISDIR(statres.st_mode)) { return statres.st_blocks; } //目录文件/aaa/bbbb/cccc/dd strncpy(nextpath,path,PATHSIZE); strncat(nextpath,"/*",PATHSIZE);//字符串追加 glob(nextpath,0,NULL,&globres); strncpy(nextpath,path,PATHSIZE); strncat(nextpath,"/.*",PATHSIZE); //追加 glob(nextpath,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]); } globfree(&globres); return sum; } int main(int argc,char*argv[]) { if(argc<2) { fprintf(stderr,"Usage....\n"); exit(1); } printf("%ld\n", mydu(argv[1])/2); exit(0); }```
最新回复(0)