C++獲取文件大小數(shù)值的三種方式介紹
方式一
推薦使用此方式獲得文件大小!
C/C++、Window、Linux 環(huán)境都可以使用!
通過結(jié)構(gòu)體struct stat獲得。
需要包含頭文件:#include <sys/stat.h> // struct stat
// 通過stat結(jié)構(gòu)體 獲得文件大小,單位字節(jié)
size_t getFileSize1(const char *fileName) {
if (fileName == NULL) {
return 0;
}
// 這是一個(gè)存儲(chǔ)文件(夾)信息的結(jié)構(gòu)體,其中有文件大小和創(chuàng)建時(shí)間、訪問時(shí)間、修改時(shí)間等
struct stat statbuf;
// 提供文件名字符串,獲得文件屬性結(jié)構(gòu)體
stat(fileName, &statbuf);
// 獲取文件大小
size_t filesize = statbuf.st_size;
return filesize;
}首先也是通過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í)!
// 通過打開文件 獲得文件大小,單位字節(jié)
long long getFileSize2(const char *fileName) {
/*
解釋這里為什么用_fseeki64而不用fseek:
_fseeki64可以兼容x64項(xiàng)目和x86項(xiàng)目
fseek只能兼容x86項(xiàng)目
這里說的兼容并不是能不能用的問題,而是準(zhǔn)不準(zhǔn)確的問題!
在x64項(xiàng)目使用fseek,返回的數(shù)據(jù)可能會(huì)不準(zhǔn)確!
*/
if (fileName == NULL) {
return -1;
}
FILE *fp = NULL;
long long fileSize = 0;
// 打開文件
errno_t err = fopen_s(&fp, fileName, "r");
if (err != 0) { // 不等0,打開文件失敗
printf("Open file %s fail, code %d \n", fileName, err);
return -1;
}
// 將文件光標(biāo)位置從末尾處移動(dòng)0個(gè)位置 -->也可以這樣說:(將文件光標(biāo)從開頭位置移動(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ù)沒有對(duì)文件有其他操作,下面將文件指針移動(dòng)回來的代碼可以忽略 */
// 將文件光標(biāo)位置從開頭處移動(dòng)0個(gè)位置 -->也可以這樣說:(將文件光標(biāo)從末尾位置移動(dòng)到開頭位置)
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)目
這里說的兼容并不是能不能用的問題,而是準(zhǔn)不準(zhǔn)確的問題!
在x64項(xiàng)目使用fseek,返回的數(shù)據(jù)可能會(huì)不準(zhǔn)確!
通過移動(dòng)文件光標(biāo)的方式獲得文件大小。
首先將文件光標(biāo)移動(dòng)到文件末尾,然后獲取文件光標(biāo)的位置,也就是獲得文件的大小,獲取后再將文件光標(biāo)移動(dòng)回文件開頭即可!
如果只是單純的獲取文件大小,后續(xù)沒有對(duì)文件有其他操作,將文件指針移動(dòng)回來的代碼可以忽略。
直接拷貝代碼到自己的項(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;
// 打開文件
inFile.open(fileName, std::ios::in);
if (inFile.is_open() == false) { // 文件打開失敗
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)到開頭文件
inFile.seekg(0, std::ios_base::beg);
// 關(guān)閉文件
inFile.close();
return fileSize;
}其獲取思路和C語(yǔ)言類似!
都是通過移動(dòng)文件光標(biāo)指針獲得!
直接拷貝代碼到自己的項(xiàng)目中去就可以用了!
總結(jié)
在項(xiàng)目中,我還是比較喜歡使用第一種方式,因?yàn)槠浯a量少,且獲取速度快,我可以不定義函數(shù)直接拷貝那幾句代碼到項(xiàng)目中去就可以使用了,很方便,省去了打開文件的操作!
到此這篇關(guān)于C++獲取文件大小數(shù)值的三種方式介紹的文章就介紹到這了,更多相關(guān)C++獲取文件大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)
鏈表是線性表的鏈?zhǔn)酱鎯?chǔ)方式。鏈表的內(nèi)存是不連續(xù)的,前一個(gè)元素存儲(chǔ)地址的下一個(gè)地址中存儲(chǔ)的不一定是下一個(gè)元素。小編今天就將帶大家深入了解一下鏈表,快來學(xué)習(xí)吧2021-12-12
C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
C++實(shí)現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言多種方法實(shí)現(xiàn)一個(gè)函數(shù)左旋字符串中K個(gè)字符
這篇文章主要為大家介紹了C語(yǔ)言多種方法實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中K個(gè)字符,文中附含詳細(xì)的示例講解,有需要的朋友可以借鑒參考下2021-10-10
C語(yǔ)言字符串函數(shù)模擬實(shí)現(xiàn)流程介紹
字符串函數(shù)(String processing function)也叫字符串處理函數(shù),指的是編程語(yǔ)言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長(zhǎng)度,字符查找等的函數(shù)2022-09-09
浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的
這篇文章介紹了浮點(diǎn)數(shù)在計(jì)算機(jī)中是如何存儲(chǔ)的,講解的比較詳細(xì),有需要的朋友可以參考一下。2016-06-06
C語(yǔ)言動(dòng)態(tài)內(nèi)存規(guī)劃詳解
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存的規(guī)劃,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-10-10

