如何以编程方式在Linux中获取目录的可用磁盘空间
是否有一个函数返回给定目录path的驱动器分区上有多less空闲空间?
检查man statvfs(2)
我相信你可以计算'自由空间'为f_bsize * f_bfree
。
NAME statvfs, fstatvfs - get file system statistics SYNOPSIS #include <sys/statvfs.h> int statvfs(const char *path, struct statvfs *buf); int fstatvfs(int fd, struct statvfs *buf); DESCRIPTION The function statvfs() returns information about a mounted file system. path is the pathname of any file within the mounted file system. buf is a pointer to a statvfs structure defined approximately as follows: struct statvfs { unsigned long f_bsize; /* file system block size */ unsigned long f_frsize; /* fragment size */ fsblkcnt_t f_blocks; /* size of fs in f_frsize units */ fsblkcnt_t f_bfree; /* # free blocks */ fsblkcnt_t f_bavail; /* # free blocks for unprivileged users */ fsfilcnt_t f_files; /* # inodes */ fsfilcnt_t f_ffree; /* # free inodes */ fsfilcnt_t f_favail; /* # free inodes for unprivileged users */ unsigned long f_fsid; /* file system ID */ unsigned long f_flag; /* mount flags */ unsigned long f_namemax; /* maximum filename length */ };
你可以使用boost :: filesystem:
struct space_info // returned by space function { uintmax_t capacity; uintmax_t free; uintmax_t available; // free space available to a non-privileged process }; space_info space(const path& p); space_info space(const path& p, system::error_code& ec);
例:
#include <boost/filesystem.hpp> using namespace boost::filesystem; space_info si = space("."); cout << si.available << endl;
返回:types为space_info的对象。 space_info对象的值是通过使用POSIX statvfs()来获得POSIX结构体statvfs,然后将其f_blocks,f_bfree和f_bavail成员乘以其f_frsize成员,并将结果分配给容量,free和可用的成员分别。 任何值不能确定的成员应被设置为-1。
使用df -h /path/to/directory
(助记符,“无磁盘”)。 -h
标志使它使用人类可读的基本2大小(基于1024字节到千字节),而不是512字节块的原始计数。 您可以使用-H
获得基数为10的大小(基于1000字节到千字节 – 您知道,硬盘制造商宣传的大小)。
例:
$ df -h . Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 233Gi 82Gi 150Gi 36% /
要指定使用情况,请使用du -h /path
(磁盘使用情况)。
可以通过使用如下的pipe道将命令输出到程序中:
char cmd[]="df -h /path/to/directory" ; FILE* apipe = popen(cmd, "r"); // if the popen succeeds read the commands output into the program with while ( fgets( line, 132 , apipe) ) { // handle the readed lines } pclose(apipe); // -----------------------------------