2012-01-11 74 views
0
int filesize(FILE * handle) 
{ 
    int filesize; 
    int old_pointer = ftell(handle); 
    fseek(handle, 0, SEEK_END); 
    filesize = ftell(handle); 
    fseek(handle, old_pointer, SEEK_SET); 
    return filesize; 
} 

這是函數返回文件大小的好方法嗎?返回文件大小的函數?

回答

2

只要文件不太大(對於32位系統或Windows 64位,意味着不超過2 GiB),這是一種方法。它具有或多或少在任何平臺上工作的優點。當然,ftell()返回一個long,而不是int(在64位非Windows系統上,只要您適當修復代碼,它可以報告的文件會更大)。但是,要求四個函數調用是一件很貴的事情。

POSIX的替代品是stat(),lstat()fstat()

在Windows API中會出現類似物。

+0

更好的POSIX替代品是'fseeko'和'ftello'。使用'stat'系列將無法正確獲取塊設備和其他非普通文件的大小。 – 2012-01-11 03:20:29

+0

而且你不能在終端或管道上尋找......有各種各樣的限制。 – 2012-01-11 03:39:35

+0

如果文件沒有大小,詢問大小不是一個有意義的操作。只要答案存在,我的方法就會給出正確答案。 – 2012-01-11 04:03:13

0

如果您在* nix上,您可以使用stat()fstat()

0

使用stat

#include <sys/stat.h> 

int stat(const char *path, struct stat *buf); 

struct stat { 
      dev_t  st_dev;  /* ID of device containing file */ 
      ino_t  st_ino;  /* inode number */ 
      mode_t st_mode; /* protection */ 
      nlink_t st_nlink; /* number of hard links */ 
      uid_t  st_uid;  /* user ID of owner */ 
      gid_t  st_gid;  /* group ID of owner */ 
      dev_t  st_rdev; /* device ID (if special file) */ 
--->  off_t  st_size; /* total size, in bytes */ 
      blksize_t st_blksize; /* blocksize for file system I/O */ 
      blkcnt_t st_blocks; /* number of 512B blocks allocated */ 
      time_t st_atime; /* time of last access */ 
      time_t st_mtime; /* time of last modification */ 
      time_t st_ctime; /* time of last status change */ 
}; 
1

我個人使用的函數從stat家庭,像這樣。另外請注意,int對於返回值可能太小(特別是在32位系統上); off_t保證工作。

off_t filesize(FILE *handle) { 
    struct stat statbuf; 
    if (fstat(fileno(handle), &statbuf) != 0) { 
     // handle an error 
    } else { 
     return statbuf.st_size; 
    } 
} 

另請注意,這可以很容易地調整,以針對未使用的標準stat()代替fstat()尚未打開的文件。