Solved

c++/Linux checking available hard drive space

Posted on 2002-04-30
4
350 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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

759 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

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now