網站首頁 編程語言 正文
方式一
推薦使用此方式獲得文件大?。?/p>
C/C++、Window、Linux 環境都可以使用!
通過結構體struct stat
獲得。
需要包含頭文件:#include <sys/stat.h> // struct stat
// 通過stat結構體 獲得文件大小,單位字節 size_t getFileSize1(const char *fileName) { if (fileName == NULL) { return 0; } // 這是一個存儲文件(夾)信息的結構體,其中有文件大小和創建時間、訪問時間、修改時間等 struct stat statbuf; // 提供文件名字符串,獲得文件屬性結構體 stat(fileName, &statbuf); // 獲取文件大小 size_t filesize = statbuf.st_size; return filesize; }
首先也是通過stat函數獲得文件的基本屬性,然后再從結構體中直接進行獲取文件大小就行,很簡單,也很好用。
直接拷貝代碼到自己的項目中去就可以用了!
方式二
C語言方式獲得文件大小
不推薦使用此方式
當文件太大時,移動文件光標指針會非常耗時!
// 通過打開文件 獲得文件大小,單位字節 long long getFileSize2(const char *fileName) { /* 解釋這里為什么用_fseeki64而不用fseek: _fseeki64可以兼容x64項目和x86項目 fseek只能兼容x86項目 這里說的兼容并不是能不能用的問題,而是準不準確的問題! 在x64項目使用fseek,返回的數據可能會不準確! */ 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; } // 將文件光標位置從末尾處移動0個位置 -->也可以這樣說:(將文件光標從開頭位置移動到末尾位置) int errer = _fseeki64(fp, 0, SEEK_END); if (err != 0) { // 不等0,移動文件光標失敗 printf("Failed to move cursor!(SEEK_END)\n"); return -1; } // 獲得當前文件指針位置,也就是間接獲得文件大小 fileSize = _ftelli64(fp); /* 如果只是單純的獲取文件大小,后續沒有對文件有其他操作,下面將文件指針移動回來的代碼可以忽略 */ // 將文件光標位置從開頭處移動0個位置 -->也可以這樣說:(將文件光標從末尾位置移動到開頭位置) errer = _fseeki64(fp, 0, SEEK_SET); if (err != 0) { // 不等0,移動文件光標失敗 printf("Failed to move cursor!(SEEK_SET)\n"); return -1; } // 關閉文件 fclose(fp); return fileSize; }
解釋這里為什么用_fseeki64而不用fseek:
_fseeki64可以兼容x64項目和x86項目
fseek只能兼容x86項目
這里說的兼容并不是能不能用的問題,而是準不準確的問題!
在x64項目使用fseek,返回的數據可能會不準確!
通過移動文件光標的方式獲得文件大小。
首先將文件光標移動到文件末尾,然后獲取文件光標的位置,也就是獲得文件的大小,獲取后再將文件光標移動回文件開頭即可!
如果只是單純的獲取文件大小,后續沒有對文件有其他操作,將文件指針移動回來的代碼可以忽略。
直接拷貝代碼到自己的項目中去就可以用了!
方式三
C++ 方式獲得文件大小
不推薦使用此方式
當文件太大時,移動文件光標指針會非常耗時!
需要包含頭文件:
#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; } // 文件指針移動到末尾位置 inFile.seekg(0, std::ios_base::end); // 獲取當前文件指針位置,也就是獲得文件大小 std::streampos fileSize = inFile.tellg(); // 文件指針移動到開頭文件 inFile.seekg(0, std::ios_base::beg); // 關閉文件 inFile.close(); return fileSize; }
其獲取思路和C語言類似!
都是通過移動文件光標指針獲得!
直接拷貝代碼到自己的項目中去就可以用了!
總結
在項目中,我還是比較喜歡使用第一種方式,因為其代碼量少,且獲取速度快,我可以不定義函數直接拷貝那幾句代碼到項目中去就可以使用了,很方便,省去了打開文件的操作!
原文鏈接:https://blog.csdn.net/cpp_learner/article/details/123018360
相關推薦
- 2023-04-03 python中super().__init__()作用詳解_python
- 2022-03-08 Asp.NetCore3.1開源項目升級為.Net6.0的方法實現_實用技巧
- 2022-04-11 python實現簡易聊天對話框_python
- 2022-04-12 Apache?Pulsar集群搭建部署詳細過程_Linux
- 2022-06-24 python包相關知識點之包的導入、相對路徑以及絕對路徑_python
- 2022-09-23 win11下FTP服務器搭建圖文教程_FTP服務器
- 2021-12-12 C語言的常量和字符串_C 語言
- 2022-11-11 C#中的Hashtable?類使用詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支