Linux下的C++程序:统计一个目录及其内部文件总共占据的空间大小

统计一个目录的大小(比特数),最简单的办法是在控制台输入命令:

du -sb 目录地址

用C++实现这个功能,是通过递归遍历目录下的文件和子目录达到的。需要注意的是,因为Byte数过大,单用一个整型统计Byte的数量,遇到大一些的目录会出现溢出。因此我采用了TB、GB、MB、KB和Byte五个层级来表示目录的大小。

我的代码如下:

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

#define BYTES_OF_CURRENT_FOLDER 4096

class CheckSpace
{
public:

	//构造函数
	CheckSpace(char *filepath)
	{
		this -> m_TB = 0;
		this -> m_GB = 0;
		this -> m_MB = 0;
		this -> m_KB = 0;
		this -> m_Bytes = 0;
		strcpy(this -> m_FilePath, filepath);

		Check(filepath); //统计目录中的文件占据的空间大小
		AddBytes(4096);  //加上该目录本身占据的4096
	}

	//获取各项属性
	int GetTB() { return this -> m_TB; }
	int GetGB() { return this -> m_GB; }
	int GetMB() { return this -> m_MB; }
	int GetKB() { return this -> m_KB; }
	int GetBytes() { return this -> m_Bytes; }

	//展示内容
	void Display()
	{
		printf("查询目录路径 %s\n", m_FilePath);
		printf("占用空间 %dTB %dGB %dMB %dKB %dByte(s)\n",
			m_TB, m_GB, m_MB, m_KB, m_Bytes);
	}

private:

	int m_TB;    //TB
	int m_GB;    //GB
	int m_MB;    //MB
	int m_KB;    //KB
	int m_Bytes; //Byte
	char m_FilePath[128]; //目录地址

	//Byte数量增加(自动进位)
	void AddBytes(int bytes)
	{
		m_Bytes += bytes;
		while (m_Bytes >= 1024)
		{
			m_Bytes -= 1024;
			m_KB++;
		}
		while (m_KB >= 1024)
		{
			m_KB -= 1024;
			m_MB++;
		}
		while (m_MB >= 1024)
		{
			m_MB -= 1024;
			m_GB++;
		}
		while (m_GB >= 1024)
		{
			m_GB -= 1024;
			m_TB++;
		}
	}

	//查看某目录所占空间大小(不含该目录本身的4096Byte)
	void Check(char *dir)
	{
		DIR *dp;
		struct dirent *entry;
		struct stat statbuf;

		if ((dp = opendir(dir)) == NULL)
		{
			fprintf(stderr, "Cannot open dir: %s\n", dir);
			exit(0);
		}

		chdir(dir);

		while ((entry = readdir(dp)) != NULL)
		{
			lstat(entry -> d_name, &statbuf);
			if (S_ISDIR(statbuf.st_mode))
			{
				if (strcmp(".", entry -> d_name) == 0 ||
					strcmp("..", entry -> d_name) == 0)
				{
					continue;
				}

				AddBytes(statbuf.st_size);
				Check(entry -> d_name);
			}
			else
			{
				AddBytes(statbuf.st_size);
			}
		}

		chdir("..");
		closedir(dp);
	}
};

int main()
{
	char topdir[100] = "/home/oracle/Neeq/Source/";

	//printf("Directory Scan of Dir: %s\n", topdir);
	CheckSpace cs = CheckSpace(topdir);
	cs.Display();
	//printf("Done.\n");

	return 0;
}

程序运行结果截图如下:

通过计算器可知:

2*1024*1024*1024+933*1024*1024+847*1024+519=3126672903

这个结果与du统计出的结果是一致的

END

时间: 2024-10-06 05:39:34

Linux下的C++程序:统计一个目录及其内部文件总共占据的空间大小的相关文章

linux 下密码加密程序(可以用于替换shadow文件中的用户密码)

源码如下: #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ if(argc != 3){ printf("%s <salt> <crypt>\n",argv[0]); return -1; } char *passwd = crypt(argv[1],argv[2]); printf("passwd : %s\n",pas

linux 下password加密程序(能够用于替换shadow文件里的用户password)

源代码例如以下: #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ if(argc != 3){ printf("%s <salt> <crypt>\n",argv[0]); return -1; } char *passwd = crypt(argv[1],argv[2]); printf("passwd : %s\n",

Linux下执行Java程序

在linux下编译java程序,执行javac编译生成class文件时,在centos7终端输入如,javac hello.java    会提示未找到指令,但用java -verison测试环境变量是没问题的 百度了好久,说的很复杂,重新再linux配置环境变量,输入 vi /etc/profile进入,添加以下代码: export JAVA_HOME=/usr/local/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATH export CLASSPA

统计一个目录下所有普通文件的总行数

1. 统计一个目录下所有普通文件的总行数 #实用场景:毕业设计时,需要统计自己的代码行数# 方案一:find . -type f -name "*.c" -exec cat {} \; | grep -v '^$' | wc -l 解释:find . -type f -name "*.c" 查找当前目录下所有以.c结尾的文件,如果不考虑文件类型,可以直接实用find . -type f即可. -exec cat {} \; 是将找到的文件采用cat命令输出; gre

两种在linux下创建应用程序快捷方式的方法

两种在linux下创建应用程序快捷方式的方法: A. 在桌面上创建快捷方式 B. 在应用程序菜单中添加快捷方式 在桌面上创建快捷方式 这是最简单的一种方法,在桌面上单击鼠标右键,会有一个“创建启动器”栏.这里我以为mplayer创建快捷方式为例说明: 名称-mplayer(或者你喜欢的任何名称,这个名称会出现在快捷图标的 下方) 命令-/usr/bin/gmplayer(这个是mplayer的gui应用程序的执行文件,跟 安装路径相关,可以通过which gmplayer找到) 图标-一般应用程

Linux下查看进程(程序)启动时的环境变量

背景: 因最近试安装Linux下的jira,有一个中文插件安装后,一旦设置开机启动后,它是英文,而在终端再重新启动一次后呢,似乎插件生效,它又恢复为正常中文界面,我首先想这这涉及到一个环境变量的问题,因为在我设置开机启动的服务时用service jira start出现找不到一些变量,如:获取不到java的home目录,提示找不到,为此,我加上了java的环境变量开机启动Ok了,但是英文,我对英文认识少,但还是想用中文,否则插件就等于白安了. 为此,需要弄清这两者的环境变量的区别在哪儿,如何查看

如何使用加多宝(jdb)在linux下调试Java程序

毕业时写了一段时间的C,那时候调试使用gdb,后来转了java,当时就想java程序怎么调试,找了一下,果然,那就是jdk自带的jdb windows里是这样的 Linux下是这样的 一般我在linux下来调试Java程序 好,那么,问题来了,这玩意怎么用?有好几种玩法 第一种玩法:以经典的HelloWorld为例,先写一个Java程序,如下: 我们把编译好的类上传到linux下,如下所示 务必强调一下:类所在的包名的层次结构也要在linux下体现出来 下面我们来玩起来,在linux下操作如下

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具. 分以下几个内容介绍: 1.调试之前的工作 2.选择调试工具 3.调试步骤 点我,请帮我投一票! 调试之前的工作 编译器在编译阶段需要产生可供调试的代码,才能被

统计指定目录下面的文件类型及数量

import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 统计指定目录下面的文件类型及数量 * * @author Administrator * */ public class FileCountTest { // 定义静态变量resultMap,存放