C/C++ 獲取文件大小


在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\n",   
        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\nDisk_available = %llu MB = %llu GB\n",   
        freeDisk>>20, freeDisk>>30, availableDisk>>20, availableDisk>>30);  
      
    return 0;  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM