Подтвердить что ты не робот

Как программно получить свободное место на диске для каталога в Linux

Есть ли функция, которая возвращает количество свободного места на диске, заданное путь к каталогу?

4b9b3361

Ответ 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);
// -----------------------------------