2010年7月19日 星期一

如何取得檔案大小 (C/C++)

<方法一> 利用 ftell
unsigned long GetFileLength ( FILE * fileName)
{
unsigned long pos = ftell(fileName);
unsigned long len = 0;
fseek ( fileName, 0L, SEEK_END );
len = ftell ( fileName );
fseek ( fileName, pos, SEEK_SET );
return len;
}
<方法二> 利用stat
//////////////////////////////////////////////////////////////////////////////////////////////////
標頭檔:(unistd.h), (sys/types.h), (sys/stat.h)
函式定義: int stat(const char *path, struct stat *buf);
說明:
stat 會回覆被連結的檔案資訊
stat 的system call 會回傳一個資料結構,回傳的狀況如下

struct stat statbuf;
mode_t modes;

stat("filename", &statbuf);
modes = statbuf.st_mode;

詳細出處參考:
http://www.superfunction.net/C/system_call.jsp?transno=100000008
http://dev.firnow.com/course/3_program/c++/cppsl/20081010/149898.html
//////////////////////////////////////////////////////////////////////////////////////////////////
unsigned long GetFileLength2 ( char * fileName)

{
struct stat buf;
int i = stat ( fileName, &buf );

if (i !=0)
MessageBox(NULL,"ERROR for STAT","ERROR",0);

return buf.st_size;
}
上面方法來自於 http://www.tek-tips.com/viewthread.cfm?qid=1080801&page=6

<方法三> 利用filelength 必須include<>
原型: long filelength(int fd)
long GetFileLength3(char *fileName)
{
int fd = open(fileName,O_RDONLY | O_BINARY);
if(fd == -1 ) return -1;
long lsize = filelength(fd);
close(fd);
return lsize;
}
<方法四> 利用Windows API GetFileSize & GetFileSizeEx
Large File Size 請使用 GetFileSizeEx函式。
<方法五> 利用Windows API FindFirstFile()
/// For Windows:
#include
double dblFileSize(const char* fname)
{
if (!fname && !*fname)
return 0.0;
HANDLE h;
WIN32_FIND_DATA info;

if ((h=FindFirstFile(fname,&info))
!= INVALID_HANDLE_VALUE)
{
FindClose(h);
if ((info.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
== 0) // Is it a file?
{
union
{
struct { DWORD low, high; } lh;
__int64 size; // MS large int extension
} file;
file.lh.low = info.nFileSizeLow;
file.lh.high= info.nFileSizeHigh;
return file.size; // will be casted to double
}
// It's a directory, not a file
}
return 0.0; // No such name.
}
<方法五> 來自於 http://www.tek-tips.com/viewthread.cfm?qid=1080801&page=6
方法 1~3都無法處理大檔案,要注意~ : )



參考其他方式:
範例一、

在C 或C++語言中,常常會有需要開啟檔案、讀檔、寫檔等動作,但如果需要計算開啟的檔案檔案容量大小時,該如何辦到呢?

在 這邊提供一個範例給大家

這支程式主要的流程是
1. 開啟一個檔案
2. 將檔案的指標移到檔案的最後
3. 取得目前指標的位置,目前的位置,也就是檔案的大小,單位為Byte
4. 將指標移回檔案的開頭
----------------------------------------------------------------------------------
#include using namespace std; long doGetFileSize(const char* filePath, const char* mode){ long fileLength = 0; FILE *fp; //開啟檔案 if(! (fp = fopen(filePath, mode))){ //File Open Error return -1; } //移動指標到檔案的結尾 if(fseek(fp, 0, SEEK_END)) { //File seek error. return -1; } //取得檔案大小 單位byte fileLength = ftell(fp); //移動指標回檔案起始 rewind(fp); return fileLength; } ---------------------------------------------------------------------------------- 範例二、(原創) 如何得知檔案大小? /* (C) OOMusou 2007 http://oomusou.cnblogs.com Filename : ArrayCopyCout.cpp Compiler : Visual C++ 8.0 / BCB 6.0 / gcc 3.4.2 / ISO C++ Description : Demo how to get file size Release : 03/04/2007 1.0 */ #include <iostream> #include <fstream> using namespace std; int main() { ifstream file("clena.bmp",ios::in | ios::binary | ios::ate); ifstream::pos_type eof = file.tellg(); cout << "file size : " << eof << "bytes" << endl; file.close(); } 執行結果:file size : 786486bytes ios::ate會將檔案指標移到檔尾, 透過ifstream::tellg()得知目前檔案指標位置,即相當於檔案大小byte數。 或許C++還有更好的方法,這是我目前學習ifstream時得知的方式, 若有更好的方式歡迎指正,謝謝。 出處:http://www.cnblogs.com/oomusou/archive/2007/03/04/663587.html

沒有留言: