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