首页 > 系统相关 >Code-C++-Linux-统计一个文件夹占据空间大小

Code-C++-Linux-统计一个文件夹占据空间大小

时间:2023-04-11 22:15:28浏览次数:50  
标签:KB Code MB int C++ GB Linux include 1024

Code-C++-Linux-统计一个文件夹占据空间大小

https://my.oschina.net/Tsybius2014/blog/330628

从以上链接中拷贝的代码

#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);

        CheckSpaceWithoutDir(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 CheckSpaceWithoutDir(char *dir)
    {
        DIR *pDir;
        struct dirent *entry;
        struct stat statbuf;

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

        chdir(dir);

        while ((entry = readdir(pDir)) != 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);
                CheckSpaceWithoutDir(entry->d_name);
            }
            else
            {
                AddBytes(statbuf.st_size);
            }
        }

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

int main()
{
    char cTopDir[100] = "./";
    CheckSpace cs = CheckSpace(cTopDir);
    cs.Display();
    return 0;
}

输出信息

查询目录路径 ./
占用空间 0TB 0GB 0MB 1021KB 616Byte(s)

标签:KB,Code,MB,int,C++,GB,Linux,include,1024
From: https://www.cnblogs.com/yongchao/p/17307936.html

相关文章

  • C++ 按照字典序实现combination
    C++按照字典序实现combination引言C++STL提供了permutation相关的函数(std::next_permutation和std::prev_permutation),但是没有提供combination相关的函数,本文将基于字典序的方法实现一个combination相关的函数。算法回顾1.permutation用法C++的permutation是基于字典序实......
  • Linux 文件系统之 inode小结
    Linux文件系统之inode小结inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读......
  • 利用Samba共享window、Linux文件
    利用Samba共享Linux和window之间的文件1、安装Samba服务器#yum-yinstallsambasamba-client2、创建共享目录及更改权限#mkdirSharedir//自己取一个喜欢的名字#chmod777Sharedir-R//给的是最高读写权限,请根据实际需要给相应的权限3、添加用户#useraddTunan/......
  • C++复习第五天(封装)
    封装练习,设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示姓名和学号。#include<iostream>#include<string>usingnamespacestd;classStudent{public://类中的属性和行为,我们统一称为成员stringm_name;intm_Id;voidshowStudent......
  • OpenEuler Linux 部署 HadoopHA
    OpenEulerLinux部署HadoopHAopenEulerLinux部署HadoopHA主机名IP地址spark01192.168.28.11spark02192.168.28.12spark03192.168.28.13升级操作系统和软件yum-yupdate升级后建议重启安装常用软件yum-yinstallgccgcc-c++autoconfautom......
  • openEuler Linux 部署 Zookeeper 集群
    openEulerLinux部署Zookeeper集群openEulerLinux部署Zookeeper集群主机名IP地址spark01192.168.28.11spark02192.168.28.12spark03192.168.28.13升级操作系统和软件yum-yupdate升级后建议重启安装常⽤软件yum-yinstallgccgcc-c++......
  • Linux mount命令
    Linuxmount命令这个命令很重要,但是个人OS没使用过,都是在项目部署的时候弹性云主机上挂载数据盘Linuxmount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。语法mount[-hV]mount-a[-fFnrsvw][-tvfstype]mount[-fnrsvw][-ooptions[,...]]device|dirmoun......
  • Linux操作系统基础的常用命令
    1,Linux简介Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。1.1Linux介绍Linux出现于1991年,是由芬兰赫尔辛基大学学生LinusTorvalds和后来加入的众多爱好者......
  • Linux操作系统进程的状态和转换(五态模型)
    1、进程的状态和装换1.1进程的三态模型按进程在执行过程中的不同情况至少要定义三种状态:运行(running)态:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。就绪(ready)态:进程具......
  • C++-unique_lock与lock_guard区别
    C++-unique_lock与lock_guard区别https://blog.csdn.net/ccw_922/article/details/124662275https://blog.csdn.net/sinat_35945236/article/details/124505414都可以对std::mutex进行封装,实现RAII的效果。绝大多数情况下这两种锁是可以互相替代的,区别是unique_lock比lock_gu......