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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。