C/C++ 获取文件大小

摘要:
两个标准函数主要用于测试C语言中的文件大小。获取文件大小C程序:intfile_size{file*fp=fopen;if(!虽然可以获取文件大小,但有两个缺点。此时,获取的文件大小不能超过2G,否则会发生错误。然而,在大多数情况下,上述缺点是可以的。对于超大文件,还可以通过fsetpos和fgetpos获取文件大小。如果可能,尽量避免使用上述间接方法来获取文件大小。在Linux中,有一种更简单的方法来读取文件信息。获取文件大小也要快得多。

在C语言中测试文件的大小,主要使用二个标准函数。

1.fseek 

  函数原型:int fseek ( FILE * stream, long int offset, int origin );

  参数说明:stream,文件流指针;offest,偏移量;orgin,原(始位置。其中orgin的可选值有SEEK_SET(文件开始)、SEEK_CUR(文件指针当前位置)、SEEK_END(文件结尾)。

  函数说明:对于二进制模式打开的流,新的流位置是origin + offset。

2.ftell

  函数原型:long int ftell ( FILE * stream );

   函数说明:返回流的位置。对于二进制流返回值为距离文件开始位置的字节数。

获取文件大小C程序:

  1. int file_size(char* filename)  
  2. {  
  3.     FILE *fp=fopen(filename,"r");  
  4.     if(!fp) return -1;  
  5.     fseek(fp,0L,SEEK_END);  
  6.     int size=ftell(fp);  
  7.     fclose(fp);  
  8.       
  9.     return size;  
  10. }  

上述方法利用fseek移动一个文件的存取位置到文件的末尾,然后利用ftell获得目前的文件访问位置。这种方法可以认为是一种间接的获取方式。虽说可以获得文件大小,但是有两个缺点。首先,ftell的返回值为long,在不同环境下占用的字节数也不同,这就可能存在long是四个字节的情况。此时,获取的文件大小就不能超过2G,否则就会出错。

但是,上述缺点在大多数情况下都没问题,超大文件还可以通过fsetpos和fgetpos获取文件大小。最致命的缺陷就是它需要加载文件到内存,然后跳转到文件末尾,这个操作非常耗时!可能在读取少量文件时体现不出,但是当文件达到上万个时,速度就会慢的要命,这种方法相当于把所有的文件都读到内存中一遍!

如果可能,尽量避免采用上述间接的方式获取文件大小。在linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,速度也快很多。

  1. #include <sys/stat.h>  
  2. int file_size2(char* filename)  
  3. {  
  4.     struct stat statbuf;  
  5.     stat(filename,&statbuf);  
  6.     int size=statbuf.st_size;  
  7.   
  8.     return size;  
  9. }  

这种方式首先获得相关文件的状态信息,然后从状态信息中读取大小信息。由于没有读取文件的操作,所以操作速度非常快。强烈建议大家在linux下使用这种方式。Windows平台下肯定也有类似的函数读取文件信息,不过本人常年不在windows下编程,所以在此不做介绍。

另外,可以利用statfs函数查看磁盘空间

#include <sys/statfs.h>  
#include <stdio.h>  
  
int main()  
{  
    struct statfs diskInfo;  
      
    statfs("/home/carl/", &diskInfo);  
    unsigned long long blocksize = diskInfo.f_bsize;    //每个block里包含的字节数  
    unsigned long long totalsize = blocksize * diskInfo.f_blocks;   //总的字节数,f_blocks为block的数目  
    printf("Total_size = %llu B = %llu KB = %llu MB = %llu GB
",   
        totalsize, totalsize>>10, totalsize>>20, totalsize>>30);  
      
    unsigned long long freeDisk = diskInfo.f_bfree * blocksize; //剩余空间的大小  
    unsigned long long availableDisk = diskInfo.f_bavail * blocksize;   //可用空间大小  
    printf("Disk_free = %llu MB = %llu GB
Disk_available = %llu MB = %llu GB
",   
        freeDisk>>20, freeDisk>>30, availableDisk>>20, availableDisk>>30);  
      
    return 0;  
}  

免责声明:文章转载自《C/C++ 获取文件大小》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇湖北省大学程序设计竞赛(武大校赛)虚拟服务器跟端口映射下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

feof()判断文件结束的问题

我在编写学生成绩管理系统时用到了写文件和读文件,发现读文件总会显示出乱码,调试发现是因为用feof()做判断,在读文件最后时fread()多读取了一次。我一开始的解决办法是每次读取完文件,都把最后一个节点(每一行数据都读取放到链表的节点里)free掉。但这种方法明显不是那么好。 feof(fp)用来测试fp所指向的文件当前状态是否为“文件结束”。如果文件结...