How do I programmatically get the free disk space for a directory in Linux

后端 未结 4 2062
失恋的感觉
失恋的感觉 2020-12-23 19:42

Is there a function that returns how much space is free on a drive partition given a directory path?

相关标签:
4条回答
  • 2020-12-23 19:53

    One can get the output of a command into a program by using a pipe like this:

    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);
    // -----------------------------------
    
    0 讨论(0)
  • 2020-12-23 20:13

    You can use 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);
    

    Example:

    #include <boost/filesystem.hpp>
    using namespace boost::filesystem;
    space_info si = space(".");
    cout << si.available << endl;
    

    Returns: An object of type space_info. The value of the space_info object is determined as if by using POSIX statvfs() to obtain a POSIX struct statvfs, and then multiplying its f_blocks, f_bfree, and f_bavail members by its f_frsize member, and assigning the results to the capacity, free, and available members respectively. Any members for which the value cannot be determined shall be set to -1.

    0 讨论(0)
  • 2020-12-23 20:18

    check man statvfs(2)

    I believe you can calculate 'free space' as 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 */
               };
    
    0 讨论(0)
  • 2020-12-23 20:19

    With C++17

    You can use std::filesystem::space:

    #include <iostream>  // only needed for screen output
    
    #include <filesystem>
    namespace fs = std::filesystem;
    
    int main()
    {
        fs::space_info tmp = fs::space("/tmp");
    
        std::cout << "Free space: " << tmp.free << '\n'
                  << "Available space: " << tmp.available << '\n';
    }
    
    0 讨论(0)
提交回复
热议问题