How do you determine the size of a file in C?

前端 未结 14 934
野性不改
野性不改 2020-11-22 03:20

How can I figure out the size of a file, in bytes?

#include 

unsigned int fsize(char* file){
  //what goes here?
}
相关标签:
14条回答
  • 2020-11-22 03:52

    Looking at the question, ftell can easily get the number of bytes.

      long size = ftell(FILENAME);
      printf("total size is %ld bytes",size);
    
    0 讨论(0)
  • 2020-11-22 03:53

    Don't use int. Files over 2 gigabytes in size are common as dirt these days

    Don't use unsigned int. Files over 4 gigabytes in size are common as some slightly-less-common dirt

    IIRC the standard library defines off_t as an unsigned 64 bit integer, which is what everyone should be using. We can redefine that to be 128 bits in a few years when we start having 16 exabyte files hanging around.

    If you're on windows, you should use GetFileSizeEx - it actually uses a signed 64 bit integer, so they'll start hitting problems with 8 exabyte files. Foolish Microsoft! :-)

    0 讨论(0)
  • 2020-11-22 03:55

    Try this --

    fseek(fp, 0, SEEK_END);
    unsigned long int file_size = ftell(fp);
    rewind(fp);
    

    What this does is first, seek to the end of the file; then, report where the file pointer is. Lastly (this is optional) it rewinds back to the beginning of the file. Note that fp should be a binary stream.

    file_size contains the number of bytes the file contains. Note that since (according to climits.h) the unsigned long type is limited to 4294967295 bytes (4 gigabytes) you'll need to find a different variable type if you're likely to deal with files larger than that.

    0 讨论(0)
  • 2020-11-22 03:58

    A quick search in Google found a method using fseek and ftell and a thread with this question with answers that it can't be done in just C in another way.

    You could use a portability library like NSPR (the library that powers Firefox) or check its implementation (rather hairy).

    0 讨论(0)
  • 2020-11-22 04:01

    Matt's solution should work, except that it's C++ instead of C, and the initial tell shouldn't be necessary.

    unsigned long fsize(char* file)
    {
        FILE * f = fopen(file, "r");
        fseek(f, 0, SEEK_END);
        unsigned long len = (unsigned long)ftell(f);
        fclose(f);
        return len;
    }
    

    Fixed your brace for you, too. ;)

    Update: This isn't really the best solution. It's limited to 4GB files on Windows and it's likely slower than just using a platform-specific call like GetFileSizeEx or stat64.

    0 讨论(0)
  • 2020-11-22 04:03

    And if you're building a Windows app, use the GetFileSizeEx API as CRT file I/O is messy, especially for determining file length, due to peculiarities in file representations on different systems ;)

    0 讨论(0)
提交回复
热议问题