Есть ли функция, которая возвращает количество свободного места на диске, заданное путь к каталогу?
Как программно получить свободное место на диске для каталога в Linux
Ответ 1
проверить 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 */
};
Ответ 2
Вы можете использовать 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;
Возвращает: объект типа space_info. Значение объекта space_info определяется как с помощью POSIX statvfs() для получения POSIX struct statvfs, а затем умножения его членов f_blocks, f_bfree и f_bavail на его член f_frsize и присвоения результатов емкости, свободной и доступных членов соответственно. Любые члены, для которых значение не может быть определено, должны быть установлены на -1.
Ответ 3
Используйте df -h /path/to/directory
(мнемонически, "свободный диск" ). Флаг -h
заставляет его использовать человекочитаемые размеры базы-2 (на основе 1024 байта для килобайта), а не сырое количество 512-байтовых блоков. Вы можете получить размеры базы-10 (на основе 1000 байтов на килобайт - вы знаете, размеры, которые рекламируют производители жестких дисков) с помощью -h
.
Пример:
$ df -h .
Filesystem Size Used Avail Capacity Mounted on
/dev/disk0s2 233Gi 82Gi 150Gi 36% /
Чтобы использовать атрибут, используйте du -h /path
(использование диска).
Ответ 4
Можно получить вывод команды в программу, используя такой канал:
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);
// -----------------------------------