+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > C++获取文件大小数值的三种方式介绍 >

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

时间:2024-04-16 10:56:37

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

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) {
    
    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++获取文件大小数值的三种方式介绍的文章就介绍到这了。

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title