Solved

c++/Linux checking available hard drive space

Posted on 2002-04-30
4
354 Views
Last Modified: 2012-05-05
I have a client and server which transfers files back and
fourth, each runs on its own machine. I wanted to check the available hard drive space to make sure I have room
to save a file as it's received before I save it.
With the first packet of the file I have the size of the file to save, I just need to find out how to query the
hard drive and compare.
0
Comment
Question by:mitchguy
  • 3
4 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 6980532
'df' from the GNU file utils does that - you can get the source code here: ftp://ftp.gnu.org/pub/gnu/fileutils/fileutils-4.1.tar.gz
0
 
LVL 86

Expert Comment

by:jkr
ID: 6980557
BTW, 'df' does that by calling 'statfs()':

STATFS(2)           Linux Programmer's Manual           STATFS(2)


NAME
       statfs, fstatfs - get file system statistics

SYNOPSIS
       #include <sys/vfs.h>

       int statfs(const char *path, struct statfs *buf);
       int fstatfs(int fd, struct statfs *buf);

DESCRIPTION
       statfs  returns  information  about a mounted file system.
       path is the path name  of  any  file  within  the  mounted
       filesystem.   buf  is  a  pointer  to  a  statfs structure
       defined as follows:

              struct statfs {
                 long    f_type;     /* type of filesystem (see below) */
                 long    f_bsize;    /* optimal transfer block size */
                 long    f_blocks;   /* total data blocks in file system */
                 long    f_bfree;    /* free blocks in fs */
                 long    f_bavail;   /* free blocks avail to non-superuser */
                 long    f_files;    /* total file nodes in file system */
                 long    f_ffree;    /* free file nodes in fs */
                 fsid_t  f_fsid;     /* file system id */
                 long    f_namelen;  /* maximum length of filenames */
                 long    f_spare[6]; /* spare for later */
              };

              File system types:

              linux/affs_fs.h:
                 AFFS_SUPER_MAGIC      0xADFF
              linux/ext_fs.h:
                 EXT_SUPER_MAGIC       0x137D
              linux/ext2_fs.h:
                 EXT2_OLD_SUPER_MAGIC  0xEF51
                 EXT2_SUPER_MAGIC      0xEF53
              linux/hpfs_fs.h:
                 HPFS_SUPER_MAGIC      0xF995E849
              linux/iso_fs.h:
                 ISOFS_SUPER_MAGIC     0x9660
              linux/minix_fs.h:
                 MINIX_SUPER_MAGIC     0x137F /* orig. minix */
                 MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
                 MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
                 MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
              linux/msdos_fs.h:
                 MSDOS_SUPER_MAGIC     0x4d44
              linux/ncp_fs.h:
                 NCP_SUPER_MAGIC       0x564c
              linux/nfs_fs.h:
                 NFS_SUPER_MAGIC       0x6969
              linux/proc_fs.h:
                 PROC_SUPER_MAGIC      0x9fa0
              linux/smb_fs.h:
                 SMB_SUPER_MAGIC       0x517B
              linux/sysv_fs.h:
                 XENIX_SUPER_MAGIC     0x012FF7B4
                 SYSV4_SUPER_MAGIC     0x012FF7B5
                 SYSV2_SUPER_MAGIC     0x012FF7B6
                 COH_SUPER_MAGIC       0x012FF7B7
              linux/ufs_fs.h:
                 UFS_MAGIC             0x00011954
              linux/xia_fs.h:
                 _XIAFS_SUPER_MAGIC    0x012FD16D

       Fields that are undefined for a particular file system are
       set  to -1.  fstatfs returns the same information about an
       open file referenced by descriptor fd.

RETURN VALUE
       On success, zero is returned.  On error, -1  is  returned,
       and errno is set appropriately.

ERRORS
       For statfs:

       ENOTDIR A  component  of  the path prefix of path is not a
               directory.

       ENAMETOOLONG
               path is too long.

       ENOENT  The file referred to by path does not exist.

       EACCES  Search permission is denied for a component of the
               path prefix of path.

       ELOOP   Too many symbolic links were encountered in trans-
               lating path.

       EFAULT  Buf or path points to an invalid address.

       EIO     An I/O error occurred while reading from or  writ-
               ing to the file system.

       ENOMEM  Insufficient kernel memory was available.

       ENOSYS  The filesystem path is on does not support statfs.

       For fstatfs:

       EBADF   fd is not a valid open file descriptor.

       EFAULT  buf points to an invalid address.

       EIO     An I/O error occurred while reading from or  writ-
               ing to the file system.

       ENOSYS  The  filesystem  fd  is  open  on does not support
               statfs.

CONFORMING TO
       4.4BSD.

SEE ALSO
       stat(2)
0
 

Author Comment

by:mitchguy
ID: 6980901
to use fstatfs I need the file descriptor. when I do a df
it gives.  
Filesystem          Mounted on
/dev/sda6 ......... /
/dev/sda1 ......... /boot
/dev/sdb  ......... /usr0

is there a way to get the file descriptor for
/dev/sdb /usr0
and is /dev/sdb always for user space?
0
 
LVL 86

Accepted Solution

by:
jkr earned 75 total points
ID: 6980931
Use 'statfs()', instead of 'fstatfs()' - as I posted above:

      int statfs(const char *path, struct statfs *buf);

It takes a path...
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question