statfs获取磁盘使用信息

statfs 结构体

struct statfs{
    long f_type;     //文件系统的类型
    long f_bsize;   //经优化后的传输块的大小
    long f_blocks;  //文件系统数据块总数
    long f_bfree;    //可用块数
    long f_bavail;   //普通用户能够获得的块数
    long f_files;      //文件结点总数
    long f_ffree;     //可用文件结点数
    fisd_t f_fsid;     //文件系统标识
    long f_namelen;  //文件名的最大长度
}

statfs/fstatfs 函数

int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
  • path: 需要查询信息的文件系统的文件路径名。

  • fd: 需要查询信息的文件系统的文件描述词。

  • buf:指向statfs结构体的指针,用于储存文件系统相关的信息

成功执行时,返回0。失败返回-1,errno被设为以下的某个值:

EACCES: (statfs())文件或路径名中包含的目录不可访问
EBADF : (fstatfs()) 文件描述词无效
EFAULT: 内存地址无效
EINTR : 操作由信号中断
EIO : 读写出错
ELOOP : (statfs())解释路径名过程中存在太多的符号连接
ENAMETOOLONG:(statfs()) 路径名太长
ENOENT:(statfs()) 文件不存在
ENOMEM: 核心内存不足
ENOSYS: 文件系统不支持调用
ENOTDIR:(statfs())路径名中当作目录的组件并非目录
EOVERFLOW:信息溢出

代码示例:

GitHub: DiskUsage

#include <sys/statfs.h>
#include <cstdio>
#include <cstdint>

#define KB 1024.0       // 2^10
#define MB 1048576.0    // 2^20
#define GB 1073741824.0 // 2^30

int main()
{
        struct statfs diskInfo{};

        statfs("/home", &diskInfo);
        uint64_t blocksize = diskInfo.f_bsize;                   // 每个block里包含的字节数
        uint64_t totalsize = blocksize * diskInfo.f_blocks;      // 总的字节数,f_blocks为block的数目

        printf("块数:%lu\n",diskInfo.f_blocks);
        printf("Total_size = %lu B = %f KB = %f MB = %f GB\n",
                totalsize,
                totalsize / KB,
                totalsize / MB,
                totalsize / GB);

        uint64_t freeDisk = diskInfo.f_bfree * blocksize;       // 剩余空间的大小
        uint64_t availableDisk = diskInfo.f_bavail * blocksize; // 可用空间大小

        printf("Disk_free = %f MB = %f GB\n"
                        "Disk_available = %f MB = %f GB\n",
                freeDisk / MB,
                freeDisk / GB,
                availableDisk / MB,
                availableDisk / GB);

        return 0;
}

输出:

/home/leacock/CLionProjects/LearnDemos/FileOperationDemo/DiskUsage/cmake-build-debug/DiskUsage
块数:10255160
Total_size = 42005135360 B = 41020640.000000 KB = 40059.218750 MB = 39.120331 GB
Disk_free = 16693.273438 MB = 16.302025 GB
Disk_available = 14629.375000 MB = 14.286499 GB

Process finished with exit code 0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值