Click here to Skip to main content
13,400,107 members (44,544 online)
Click here to Skip to main content
Add your own
alternative version


30 bookmarked
Posted 9 Dec 2004

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

, 15 Dec 2004
Rate this:
Please Sign up or sign in to vote.
Finding the size of the file in C++ in a portable manner is not trivial!


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; 


  • 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; 


  • 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;, 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);


  • 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 );


  • 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.


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.


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.


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
Software Developer Autodesk
Canada Canada
This article was written by Christopher Diggins, a computer science nerd who currently works at Autodesk as an SDK specialist.

You may also be interested in...

Comments and Discussions

GeneralA pitfall worth noting Pin
.:floyd:.5-Oct-15 5:10
member.:floyd:.5-Oct-15 5:10 
Questionnumber of threads created so far Pin
Vinod.E14-Mar-08 0:35
memberVinod.E14-Mar-08 0:35 
QuestionRe: number of threads created so far Pin
DavidCrow30-May-08 4:32
mvpDavidCrow30-May-08 4:32 
QuestionIsn't it simpler? Pin
DaisyWheel22-Jun-07 0:51
memberDaisyWheel22-Jun-07 0:51 
AnswerRe: Isn't it simpler? Pin
Paul Sanders (AlpineSoft)20-Oct-07 8:25
memberPaul Sanders (AlpineSoft)20-Oct-07 8:25 
GeneralThank you! Pin
lchung123415-Nov-06 17:24
memberlchung123415-Nov-06 17:24 
GeneralDefined in ANSI-C Pin
pkpera13-Jun-06 8:17
memberpkpera13-Jun-06 8:17 
GeneralTried out the Compiler Specific: Visual C++ code Pin
ddas7710-May-05 21:21
memberddas7710-May-05 21:21 
Generalon stat Pin
Henry miller15-Dec-04 12:19
memberHenry miller15-Dec-04 12:19 
GeneralAn alternative: stat() Pin
skst15-Dec-04 7:29
memberskst15-Dec-04 7:29 
GeneralRe: An alternative: stat() Pin
cdiggins15-Dec-04 8:10
membercdiggins15-Dec-04 8:10 
GeneralRe: An alternative: stat() Pin
Neville Franks15-Dec-04 10:15
memberNeville Franks15-Dec-04 10:15 
GeneralRe: An alternative: stat() Pin
cdiggins15-Dec-04 10:55
membercdiggins15-Dec-04 10:55 
GeneralRe: An alternative: stat() Pin
Neville Franks15-Dec-04 11:10
memberNeville Franks15-Dec-04 11:10 
QuestionWhy not like this? Pin
Sander Bouwhuis14-Dec-04 10:38
memberSander Bouwhuis14-Dec-04 10:38 
AnswerRe: Why not like this? Pin
wac14-Dec-04 11:41
memberwac14-Dec-04 11:41 
AnswerRe: Why not like this? Pin
cdiggins14-Dec-04 11:49
membercdiggins14-Dec-04 11:49 
AnswerRe: Why not like this? Pin
f25-Jul-06 7:59
memberf25-Jul-06 7:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    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 | Terms of Use | Mobile
Web01 | 2.8.180218.2 | Last Updated 15 Dec 2004
Article Copyright 2004 by Christopher Diggins
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid