Click here to Skip to main content
Licence 
First Posted 9 Dec 2004
Views 129,408
Bookmarked 29 times

Quick and Dirty Series: C++ FileSize() function

By | 15 Dec 2004 | Article
Finding the size of the file in C++ in a portable manner is not trivial!

Introduction

The C++ standard library doesn't have a FileSize() function, and in fact, there is no simple way to query the file size in a portable manner. To help others avoid the embarrassment of asking such a question on newsgroups, I decided to post a solution.

The reason is that the size of a file is only really accessible through the operating system. C++ was written to assume as little about the platform as possible, including whether or not there is an operating system with a file system. Yeah, I know, my reaction is the same as yours, but nonetheless, we must carry onward brave programmer, and get the job done.

Compiler Specific: Visual C++

The following contribution by Jesse Chisholm works very well if you will only ever be compiling with Visual C++:

#include <sys\types.h> 
#include <sys\stat.h> 
__int64 FileSize64( const char * szFileName ) 
{ 
  struct __stat64 fileStat; 
  int err = _stat64( szFileName, &fileStat ); 
  if (0 != err) return 0; 
  return fileStat.st_size; 
}

Pitfalls:

  • Specific to Visual C++.

Non-Portable Version: stat()

Many C++ compilers provide the C run-time function stat():

#include <sys\types.h> 
#include <sys\stat.h> 
int FileSize( const char * szFileName ) 
{ 
  struct stat fileStat; 
  int err = stat( szFileName, &fileStat ); 
  if (0 != err) return 0; 
  return fileStat.st_size; 
}

Pitfalls:

  • stat() isn't part of the C++ standard, so it may or may not be available.
  • The file size may be bigger than can be represented by an int.
  • stat() isn't necessarily precise.

Portable Version: ifstream::tellg()

The following is kind of a defacto standard I use, and which I have seen often, with variations:

#include <fstream>
int FileSize(const char* sFileName)
{
  std::ifstream f;
  f.open(sFileName, std::ios_base::binary | std::ios_base::in);
  if (!f.good() || f.eof() || !f.is_open()) { return 0; }
  f.seekg(0, std::ios_base::beg);
  std::ifstream::pos_type begin_pos = f.tellg();
  f.seekg(0, std::ios_base::end);
  return static_cast<int>(f.tellg() - begin_pos);
}

Pitfalls:

  • The file size may be bigger than can be represented by an int.
  • The size of the file may be larger than what is reported.

If you can live with that, which I usually can, then great! Otherwise, there is another option.

Using Boost

There is a better solution, if you have the Boost C++ library installed which provides us with the following function:

#include <boost/filesystem/operations.hpp>
boost::intmax_t file_size( const path & ph );

Pitfalls:

  • You need to have Boost.
  • If a compiler does not support maxint_t large enough to represent the operating system's maximum file size, the returned value could be incorrect.

More information on boost::file_size is available here.

Summary

C++ is very hard to master. This is mainly because there are so many ways to do things, it can be hard to identify the best way (or the path of least evil, if you will). As a professional coder, sometimes good enough is in fact good enough, so I have decided to start a series of articles at CodeProject called the Quick and Dirty Series, for coders who need to get a job done, and wouldn't mind learning a thing or two along the way.

Acknowledgements

The following people helped out enormously by responding to my post on comp.lang.c++: Jonathan Turkanis, Siemel Naran, and Thomas Matthews. Jesse Chisholm supplied the Visual C++ version.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Christopher Diggins

Architect
Autodesk
Canada Canada

Member

Follow on Twitter Follow on Twitter
I've been programming personal computers since my I got my first Atari 400 in 1980. I currently work at Autodesk as an SDK specialist.
 
One of my passions is the design and implementation of programming languages. My current project is the Jigsaw library which includes a parsing engine and other utilities for implementing programming languages in C#.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionnumber of threads created so far PinmemberVinod.E23:35 13 Mar '08  
QuestionRe: number of threads created so far PinmvpDavidCrow3:32 30 May '08  
QuestionIsn't it simpler? PinmemberDaisyWheel23:51 21 Jun '07  
AnswerRe: Isn't it simpler? PinmemberPaul Sanders (AlpineSoft)7:25 20 Oct '07  
GeneralThank you! Pinmemberlchung123416:24 15 Nov '06  
Your article is good for my job.
Thank alot for your sharing! Smile | :)
GeneralDefined in ANSI-C Pinmemberpkpera7:17 13 Jun '06  
GeneralTried out the Compiler Specific: Visual C++ code Pinmemberddas7720:21 10 May '05  
Generalon stat PinmemberHenry miller11:19 15 Dec '04  
GeneralAn alternative: stat() Pinmemberskst6:29 15 Dec '04  
GeneralRe: An alternative: stat() Pinmembercdiggins7:10 15 Dec '04  
GeneralRe: An alternative: stat() PinmemberNeville Franks9:15 15 Dec '04  
GeneralRe: An alternative: stat() Pinmembercdiggins9:55 15 Dec '04  
GeneralRe: An alternative: stat() PinmemberNeville Franks10:10 15 Dec '04  
QuestionWhy not like this? PinmemberSander Bouwhuis9:38 14 Dec '04  
AnswerRe: Why not like this? Pinmemberwac10:41 14 Dec '04  
AnswerRe: Why not like this? Pinmembercdiggins10:49 14 Dec '04  
AnswerRe: Why not like this? Pinmemberf26:59 5 Jul '06  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120529.1 | Last Updated 15 Dec 2004
Article Copyright 2004 by Christopher Diggins
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid