C++获取文件大小数值的三种方式介绍

 更新时间:2022年10月09日 09:47:44   作者:cpp_learners  
最近在做项目时经常需要获得文件的大小操作,虽然在网络上已经有许多篇博客介绍了,但是还是想总结出自己一篇,记录一下自己在项目中是怎么获得文件大小的

方式一

推荐使用此方式获得文件大小!

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++获取文件大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言数据结构与算法之链表(一)

    C语言数据结构与算法之链表(一)

    链表是线性表的链式存储方式。链表的内存是不连续的,前一个元素存储地址的下一个地址中存储的不一定是下一个元素。小编今天就将带大家深入了解一下链表,快来学习吧
    2021-12-12
  • C语言 全局变量和局部变量详解及实例

    C语言 全局变量和局部变量详解及实例

    这篇文章主要介绍了C语言 全局变量和局部变量详解及实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言实现学生选课系统完整版

    C语言实现学生选课系统完整版

    这篇文章主要为大家详细介绍了C语言实现学生选课系统的完整版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C++实现LeetCode(13.罗马数字转化成整数)

    C++实现LeetCode(13.罗马数字转化成整数)

    这篇文章主要介绍了C++实现LeetCode(13.罗马数字转化成整数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言多种方法实现一个函数左旋字符串中K个字符

    C语言多种方法实现一个函数左旋字符串中K个字符

    这篇文章主要为大家介绍了C语言多种方法实现一个函数,可以左旋字符串中K个字符,文中附含详细的示例讲解,有需要的朋友可以借鉴参考下
    2021-10-10
  • Microsoft Visual C++ 程序的部署方法

    Microsoft Visual C++ 程序的部署方法

    由Microsoft Visual C++编译的程序动态链接到C运行时(/MD 或 /MDd),它必须运行DLL的一份拷贝(通常被叫作MSVCRT.DLL 或 MSVCRxx.DLL,其中xx代表Visual C++的版本)
    2013-04-04
  • C语言字符串函数模拟实现流程介绍

    C语言字符串函数模拟实现流程介绍

    字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数
    2022-09-09
  • 浮点数在计算机中存储方式是怎样的

    浮点数在计算机中存储方式是怎样的

    这篇文章介绍了浮点数在计算机中是如何存储的,讲解的比较详细,有需要的朋友可以参考一下。
    2016-06-06
  • vs2019创建dll以及使用的图文教程

    vs2019创建dll以及使用的图文教程

    本文主要介绍了vs2019创建dll以及使用的图文教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C语言动态内存规划详解

    C语言动态内存规划详解

    这篇文章主要介绍了C语言动态内存的规划,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10

最新评论