C++獲取文件大小數(shù)值的三種方式介紹
方式一
推薦使用此方式獲得文件大??!
C/C++、Window、Linux 環(huán)境都可以使用!
通過(guò)結(jié)構(gòu)體struct stat
獲得。
需要包含頭文件:#include <sys/stat.h> // struct stat
// 通過(guò)stat結(jié)構(gòu)體 獲得文件大小,單位字節(jié) size_t getFileSize1(const char *fileName) { if (fileName == NULL) { return 0; } // 這是一個(gè)存儲(chǔ)文件(夾)信息的結(jié)構(gòu)體,其中有文件大小和創(chuàng)建時(shí)間、訪問(wèn)時(shí)間、修改時(shí)間等 struct stat statbuf; // 提供文件名字符串,獲得文件屬性結(jié)構(gòu)體 stat(fileName, &statbuf); // 獲取文件大小 size_t filesize = statbuf.st_size; return filesize; }
首先也是通過(guò)stat函數(shù)獲得文件的基本屬性,然后再?gòu)慕Y(jié)構(gòu)體中直接進(jìn)行獲取文件大小就行,很簡(jiǎn)單,也很好用。
直接拷貝代碼到自己的項(xiàng)目中去就可以用了!
方式二
C語(yǔ)言方式獲得文件大小
不推薦使用此方式
當(dāng)文件太大時(shí),移動(dòng)文件光標(biāo)指針會(huì)非常耗時(shí)!
// 通過(guò)打開(kāi)文件 獲得文件大小,單位字節(jié) long long getFileSize2(const char *fileName) { /* 解釋這里為什么用_fseeki64而不用fseek: _fseeki64可以兼容x64項(xiàng)目和x86項(xiàng)目 fseek只能兼容x86項(xiàng)目 這里說(shuō)的兼容并不是能不能用的問(wèn)題,而是準(zhǔn)不準(zhǔn)確的問(wèn)題! 在x64項(xiàng)目使用fseek,返回的數(shù)據(jù)可能會(huì)不準(zhǔn)確! */ if (fileName == NULL) { return -1; } FILE *fp = NULL; long long fileSize = 0; // 打開(kāi)文件 errno_t err = fopen_s(&fp, fileName, "r"); if (err != 0) { // 不等0,打開(kāi)文件失敗 printf("Open file %s fail, code %d \n", fileName, err); return -1; } // 將文件光標(biāo)位置從末尾處移動(dòng)0個(gè)位置 -->也可以這樣說(shuō):(將文件光標(biāo)從開(kāi)頭位置移動(dòng)到末尾位置) int errer = _fseeki64(fp, 0, SEEK_END); if (err != 0) { // 不等0,移動(dòng)文件光標(biāo)失敗 printf("Failed to move cursor!(SEEK_END)\n"); return -1; } // 獲得當(dāng)前文件指針位置,也就是間接獲得文件大小 fileSize = _ftelli64(fp); /* 如果只是單純的獲取文件大小,后續(xù)沒(méi)有對(duì)文件有其他操作,下面將文件指針移動(dòng)回來(lái)的代碼可以忽略 */ // 將文件光標(biāo)位置從開(kāi)頭處移動(dòng)0個(gè)位置 -->也可以這樣說(shuō):(將文件光標(biāo)從末尾位置移動(dòng)到開(kāi)頭位置) errer = _fseeki64(fp, 0, SEEK_SET); if (err != 0) { // 不等0,移動(dòng)文件光標(biāo)失敗 printf("Failed to move cursor!(SEEK_SET)\n"); return -1; } // 關(guān)閉文件 fclose(fp); return fileSize; }
解釋這里為什么用_fseeki64而不用fseek:
_fseeki64可以兼容x64項(xiàng)目和x86項(xiàng)目
fseek只能兼容x86項(xiàng)目
這里說(shuō)的兼容并不是能不能用的問(wèn)題,而是準(zhǔn)不準(zhǔn)確的問(wèn)題!
在x64項(xiàng)目使用fseek,返回的數(shù)據(jù)可能會(huì)不準(zhǔn)確!
通過(guò)移動(dòng)文件光標(biāo)的方式獲得文件大小。
首先將文件光標(biāo)移動(dòng)到文件末尾,然后獲取文件光標(biāo)的位置,也就是獲得文件的大小,獲取后再將文件光標(biāo)移動(dòng)回文件開(kāi)頭即可!
如果只是單純的獲取文件大小,后續(xù)沒(méi)有對(duì)文件有其他操作,將文件指針移動(dòng)回來(lái)的代碼可以忽略。
直接拷貝代碼到自己的項(xiàng)目中去就可以用了!
方式三
C++ 方式獲得文件大小
不推薦使用此方式
當(dāng)文件太大時(shí),移動(dòng)文件光標(biāo)指針會(huì)非常耗時(shí)!
需要包含頭文件:
#include <iostream>
#include <fstream>
#include <string>
std::streampos getFileSize3(std::string fileName) { std::ifstream inFile; // 打開(kāi)文件 inFile.open(fileName, std::ios::in); if (inFile.is_open() == false) { // 文件打開(kāi)失敗 std::cout << "Open file " << fileName << " fail!" << std::endl; return -1; } // 文件指針移動(dòng)到末尾位置 inFile.seekg(0, std::ios_base::end); // 獲取當(dāng)前文件指針位置,也就是獲得文件大小 std::streampos fileSize = inFile.tellg(); // 文件指針移動(dòng)到開(kāi)頭文件 inFile.seekg(0, std::ios_base::beg); // 關(guān)閉文件 inFile.close(); return fileSize; }
其獲取思路和C語(yǔ)言類(lèi)似!
都是通過(guò)移動(dòng)文件光標(biāo)指針獲得!
直接拷貝代碼到自己的項(xiàng)目中去就可以用了!
總結(jié)
在項(xiàng)目中,我還是比較喜歡使用第一種方式,因?yàn)槠浯a量少,且獲取速度快,我可以不定義函數(shù)直接拷貝那幾句代碼到項(xiàng)目中去就可以使用了,很方便,省去了打開(kāi)文件的操作!
到此這篇關(guān)于C++獲取文件大小數(shù)值的三種方式介紹的文章就介紹到這了,更多相關(guān)C++獲取文件大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++如何將一個(gè)char轉(zhuǎn)化為string
這篇文章主要介紹了c++如何將一個(gè)char轉(zhuǎn)化為string問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解
本篇文章是對(duì)C++日志系統(tǒng)log4cxx的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言中全局變量,局部變量,靜態(tài)局部變量的區(qū)分方式
這篇文章主要介紹了C語(yǔ)言中全局變量,局部變量,靜態(tài)局部變量的區(qū)分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例
去水印是個(gè)麻煩事,本文就來(lái)介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析
這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫(xiě)一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值2013-09-09C語(yǔ)言實(shí)現(xiàn)AT指令A(yù)SCII碼的拼接處理流程
今天小編就為大家分享一篇關(guān)于C語(yǔ)言實(shí)現(xiàn)AT指令A(yù)SCII碼的拼接處理流程,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12