C/C++ 三种方式获得文件的大小
Posted cpp_learners
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 三种方式获得文件的大小相关的知识,希望对你有一定的参考价值。
最近在做项目时经常需要获得文件的大小操作,虽然在网络上已经有许多篇博客介绍了,但是还是想总结出自己一篇,记录一下自己在项目中是怎么获得文件大小的!
方式一
推荐使用此方式获得文件大小!
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语言类似!
都是通过移动文件光标指针获得!
直接拷贝代码到自己的项目中去就可以用了!
总结
在项目中,我还是比较喜欢使用第一种方式,因为其代码量少,且获取速度快,我可以不定义函数直接拷贝那几句代码到项目中去就可以使用了,很方便,省去了打开文件的操作!
以上是关于C/C++ 三种方式获得文件的大小的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu18.04下cuda.cu在c/c++中的三种使用方式
ubuntu18.04下cuda.cu在c/c++中的三种使用方式