在Linux环境一般可以通过df命令来获取磁盘空间大小,但是在编程过程中,命令方式不合适,这里我们通过Linux的API来获取空间大小,具体有两个函数statfs和fstafts,本篇记录这两个函数的基本用法。
statfs()系统调用返回有关已挂载文件系统的信息。path是装载的文件系统中任何文件的路径名。buf是一个指向statfs结构的指针,其定义大致如下:
struct statfs {
__fsword_t f_type; /* Type of filesystem (see below) */
__fsword_t f_bsize; /* Optimal transfer block size */
fsblkcnt_t f_blocks; /* Total data blocks in filesystem */
fsblkcnt_t f_bfree; /* Free blocks in filesystem */
fsblkcnt_t f_bavail; /* Free blocks available to unprivileged user */
fsfilcnt_t f_files; /* Total file nodes in filesystem */
fsfilcnt_t f_ffree; /* Free file nodes in filesystem */
fsid_t f_fsid; /* Filesystem ID */
__fsword_t f_namelen; /* Maximum length of filenames */
__fsword_t f_frsize; /* Fragment size (since Linux 2.6) */
__fsword_t f_flags; /* Mount flags of filesystem
(since Linux 2.6.36) */
__fsword_t f_spare[xxx];
/* Padding bytes reserved for future use */
};
path: 需要查询信息的文件系统的文件路径名。
fd: 需要查询信息的文件系统的文件描述词。
buf:以下结构体的指针变量,用于储存文件系统相关的信息
struct statfs {
f_type; /* 文件系统类型 */
f_bsize; /* 经过优化的传输块大小,单位B*/
f_blocks; /* 文件系统数据块总数 */
f_bfree; /* 可用块数 */
f_bavail; /* 非超级用户可获取的块数 */
f_files; /* 文件结点总数 */
f_ffree; /* 可用文件结点数 */
f_fsid; /* 文件系统标识 */
f_namelen; /* 文件名的最大长度 */
};
1.statfs函数
函数名 | statfs |
相关函数 | fstatfs |
表头文件 | #include<sys/statfs.h> |
函数定义 | int statfs(const char *path, struct statfs *buf); |
函数说明 | 获取已挂载的文件系统信息,获取成功文件系统信息保存在buf中 |
返回值 | 正常返回0,错误非0 |
示例:
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/statfs.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
int main()
{
struct statfs diskInfo1;
statfs("/", &diskInfo1);
unsigned long long blocksize1 = diskInfo1.f_bsize; //每个block里包含的字节数
unsigned long long totalsize1 = blocksize1 * diskInfo1.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk1 = diskInfo1.f_bfree * blocksize1; //剩余空间的大小
unsigned long long availableDisk1 = diskInfo1.f_bavail * blocksize1; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize1, totalsize1>>10, totalsize1>>20, totalsize1>>30);
printf("Disk_free1 = %llu MB \t= %llu GB\n", freeDisk1>>20, freeDisk1>>30);
printf("Disk_available1 = %llu MB \t= %llu GB\n", availableDisk1>>20, availableDisk1>>30);
printf("\n");
struct statfs diskInfo2;
statfs("/home", &diskInfo2);
unsigned long long blocksize2 = diskInfo2.f_bsize; //每个block里包含的字节数
unsigned long long totalsize2 = blocksize2 * diskInfo2.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk2 = diskInfo2.f_bfree * blocksize2; //剩余空间的大小
unsigned long long availableDisk2 = diskInfo2.f_bavail * blocksize2; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize2, totalsize2>>10, totalsize2>>20, totalsize2>>30);
printf("Disk_free2 = %llu MB \t= %llu GB\n", freeDisk2>>20, freeDisk2>>30);
printf("Disk_available2 = %llu MB \t= %llu GB\n", availableDisk2>>20, availableDisk2>>30);
printf("\n");
struct statfs diskInfo3;
statfs("/home/scott", &diskInfo3);
unsigned long long blocksize3 = diskInfo3.f_bsize; //每个block里包含的字节数
unsigned long long totalsize3 = blocksize3 * diskInfo3.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk3 = diskInfo3.f_bfree * blocksize3; //剩余空间的大小
unsigned long long availableDisk3 = diskInfo3.f_bavail * blocksize3; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize3, totalsize3>>10, totalsize3>>20, totalsize3>>30);
printf("Disk_free3 = %llu MB \t= %llu GB\n", freeDisk3>>20, freeDisk3>>30);
printf("Disk_available3 = %llu MB \t= %llu GB\n", availableDisk3>>20, availableDisk3>>30);
printf("\n");
struct statfs diskInfo4;
statfs("/home/scott/Videos", &diskInfo4);
unsigned long long blocksize4 = diskInfo4.f_bsize; //每个block里包含的字节数
unsigned long long totalsize4 = blocksize4 * diskInfo4.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk4 = diskInfo4.f_bfree * blocksize4; //剩余空间的大小
unsigned long long availableDisk4 = diskInfo4.f_bavail * blocksize4; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize4, totalsize4>>10, totalsize4>>20, totalsize4>>30);
printf("Disk_free4 = %llu MB \t= %llu GB\n", freeDisk4>>20, freeDisk4>>30);
printf("Disk_available4 = %llu MB \t= %llu GB\n", availableDisk4>>20, availableDisk4>>30);
printf("\n");
struct statfs diskInfo5;
statfs("/media/sf_ubuntuShare", &diskInfo5);
unsigned long long blocksize5 = diskInfo5.f_bsize; //每个block里包含的字节数
unsigned long long totalsize5 = blocksize5 * diskInfo5.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk5 = diskInfo3.f_bfree * blocksize5; //剩余空间的大小
unsigned long long availableDisk5 = diskInfo5.f_bavail * blocksize5; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize5, totalsize5>>10, totalsize5>>20, totalsize5>>30);
printf("Disk_free5 = %llu MB \t= %llu GB\n", freeDisk5>>20, freeDisk5>>30);
printf("Disk_available5 = %llu MB \t= %llu GB\n", availableDisk5>>20, availableDisk5>>30);
cout << "Hello World!" << endl;
return 0;
}
运行结果:
由以上看出,/、/home、/home/scott、 /home/scott/Videos目录获取的磁盘大小是一样的,原因是这几个目录都在同一块磁盘上,/media/sf_ubuntuShare是另外挂载的磁盘,这个并知道目录是否存在,下面这个函数可以先获取该目录是否存在,存在再获取文件系统信息。
2.fstatfs函数
函数名 | fstatfs |
相关函数 | statfs |
表头文件 | #include<sys/statfs.h> |
函数定义 | int statfs(int fd, struct statfs *buf); |
函数说明 | 获取已挂载的文件系统信息,获取成功文件系统信息保存在buf中 |
返回值 | 正常返回0,错误非0 |
示例:
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/statfs.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
int main()
{
struct statfs diskInfo1;
int fd1 = open("/", O_RDONLY);
if(fd1 == -1) {
perror("open /");
return -1;
}
fd1 = fstatfs(fd1, &diskInfo1);
if(fd1 == -1) {
perror("fstatfs fd1");
close(fd1);
return -1;
}
unsigned long long blocksize1 = diskInfo1.f_bsize; //每个block里包含的字节数
unsigned long long totalsize1 = blocksize1 * diskInfo1.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk1 = diskInfo1.f_bfree * blocksize1; //剩余空间的大小
unsigned long long availableDisk1 = diskInfo1.f_bavail * blocksize1; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize1, totalsize1>>10, totalsize1>>20, totalsize1>>30);
printf("Disk_free1 = %llu MB \t= %llu GB\n", freeDisk1>>20, freeDisk1>>30);
printf("Disk_available1 = %llu MB \t= %llu GB\n", availableDisk1>>20, availableDisk1>>30);
printf("\n");
struct statfs diskInfo2;
int fd2 = open("/home", O_RDONLY);
if(fd2 == -1) {
perror("open /home");
return -1;
}
fd2 = fstatfs(fd2, &diskInfo2);
if(fd2 == -1) {
perror("fstatfs fd2");
close(fd2);
return -1;
}
unsigned long long blocksize2 = diskInfo2.f_bsize; //每个block里包含的字节数
unsigned long long totalsize2 = blocksize2 * diskInfo2.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk2 = diskInfo2.f_bfree * blocksize2; //剩余空间的大小
unsigned long long availableDisk2 = diskInfo2.f_bavail * blocksize2; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize2, totalsize2>>10, totalsize2>>20, totalsize2>>30);
printf("Disk_free2 = %llu MB \t= %llu GB\n", freeDisk2>>20, freeDisk2>>30);
printf("Disk_available2 = %llu MB \t= %llu GB\n", availableDisk2>>20, availableDisk2>>30);
printf("\n");
struct statfs diskInfo3;
int fd3 = open("/home/scott", O_RDONLY);
if(fd3 == -1) {
perror("open /home/scott");
return -1;
}
fd3 = fstatfs(fd3, &diskInfo3);
if(fd3 == -1) {
perror("fstatfs fd3");
close(fd3);
return -1;
}
unsigned long long blocksize3 = diskInfo3.f_bsize; //每个block里包含的字节数
unsigned long long totalsize3 = blocksize3 * diskInfo3.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk3 = diskInfo3.f_bfree * blocksize3; //剩余空间的大小
unsigned long long availableDisk3 = diskInfo3.f_bavail * blocksize3; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize3, totalsize3>>10, totalsize3>>20, totalsize3>>30);
printf("Disk_free3 = %llu MB \t= %llu GB\n", freeDisk3>>20, freeDisk3>>30);
printf("Disk_available3 = %llu MB \t= %llu GB\n", availableDisk3>>20, availableDisk3>>30);
printf("\n");
struct statfs diskInfo4;
int fd4 = open("/home/scott/Videos", O_RDONLY);
if(fd4 == -1) {
perror("open /home/scott/Videos");
return -1;
}
fd4 = fstatfs(fd4, &diskInfo4);
if(fd4 == -1) {
perror("fstatfs fd4");
close(fd4);
return -1;
}
unsigned long long blocksize4 = diskInfo4.f_bsize; //每个block里包含的字节数
unsigned long long totalsize4 = blocksize4 * diskInfo4.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk4 = diskInfo4.f_bfree * blocksize4; //剩余空间的大小
unsigned long long availableDisk4 = diskInfo4.f_bavail * blocksize4; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize4, totalsize4>>10, totalsize4>>20, totalsize4>>30);
printf("Disk_free4 = %llu MB \t= %llu GB\n", freeDisk4>>20, freeDisk4>>30);
printf("Disk_available4 = %llu MB \t= %llu GB\n", availableDisk4>>20, availableDisk4>>30);
printf("\n");
struct statfs diskInfo5;
int fd5 = open("/media/sf_ubuntuShare", O_RDONLY);
if(fd5 == -1) {
perror("open /media/sf_ubuntuShare");
return -1;
}
fd5 = fstatfs(fd5, &diskInfo5);
if(fd5 == -1) {
perror("fstatfs fd5");
close(fd5);
return -1;
}
unsigned long long blocksize5 = diskInfo5.f_bsize; //每个block里包含的字节数
unsigned long long totalsize5 = blocksize5 * diskInfo5.f_blocks; //总的字节数,f_blocks为block的数目
unsigned long long freeDisk5 = diskInfo3.f_bfree * blocksize5; //剩余空间的大小
unsigned long long availableDisk5 = diskInfo5.f_bavail * blocksize5; //可用空间大小
printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB\n",
totalsize5, totalsize5>>10, totalsize5>>20, totalsize5>>30);
printf("Disk_free5 = %llu MB \t= %llu GB\n", freeDisk5>>20, freeDisk5>>30);
printf("Disk_available5 = %llu MB \t= %llu GB\n", availableDisk5>>20, availableDisk5>>30);
cout << "Hello World!" << endl;
return 0;
}
运行结果: