Ever wanted to get the size of a file from your C process? Guess what, you can! Amazing, I know. It is a basic function call to find the file size in c of your specified file.
I will provide the function, a sample program, and some executable examples.
Use The stat Function To Get File Size
The stat function provides a set of information to the user, its definition is as follows, as well there are 3 #includes required.
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat( const char *path, struct stat *buf); |
The function takes two arguments. The file path, which can include files, sockets, unix domain sockets, directories because as we all know everything in Linux / Unix are files!
To get the information about our file, the stat function populates a C structure with a set of file information.
The stat structure definition from the stat manual page.
struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ }; |
The field within this structure we are interested in is off_t st_size that holds the files size in it. As you can see we can actually retrieve a lot of extra information from this structure regarding the file.
To grab this structure we need the path to the filename and a stat structure, for instance:
u_int32_t get_file_size( const char *file_name) { struct stat buf; if ( stat(file_name, &buf) != 0 ) return (0); return ( buf.st_size ); } |
This function takes the path as an argument and returns the file size in bytes. stat will return -1 on error, and zero on success.
Example Program To Get File Size In C
Putting all this information together, here is a quick program that uses the first command line argument as the file name or path to the file, and spits out the file size in C.
#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> u_int32_t get_file_size( const char *file_name) { struct stat buf; if ( stat(file_name, &buf) != 0 ) return (0); return ( buf.st_size ); } int main( int argc, char **argv) { fprintf (stdout, "%u\n" , get_file_size(argv[1])); return 0; } |
Executing this program:
erik@debian: /home2/erik/experiments/fsize $ . /fsize . 4096 erik@debian: /home2/erik/experiments/fsize $ ls -l total 16 -rwxr-xr-x 1 erik erik 8658 2011-03-07 14:12 fsize -rw-r--r-- 1 erik erik 307 2011-03-07 14:12 fsize.c erik@debian: /home2/erik/experiments/fsize $ . /fsize fsize.c 307 erik@debian: /home2/erik/experiments/fsize $ . /fsize fsize 8658 |
Looking at the above output, I first passed in a “.” which means the current directory I am in. All Linux directories are of file size 4096 bytes. I then did an output of the current directory contents using ls which displays the binary file I am running, and the source code of the program in the .c file. As you can see the file sizes match! Yay it worked!
stat is a very useful function for getting other information about your file, it is not just for getting the file size.