用C语言获取文件长度的常见思路是:

打开文件后用 fseek() 函数把文件位置指针移动到文件的末尾,用 ftell() 获得这时位置指针距文件头的字节数,这个字节数就是文件的长度。但是这样做也会受到下面的限制:ftell() 函数的返回值是 long 类型,在Windows 下(不管是 32 位还是 64 位),long 类型变量的长度都是 4 字节,这样能正常获取到的文件长度必须小于 2GB。

微软在 Visual Studio 2005 及以后版本的开发工具中,在 stdio.h 中提供了函数 _fseeki64() 和 _ftelli64()。_fseeki64() 函数中表示文件指针偏移量的变量是 __int64 类型,_ftelli64() 的返回值也是 __int64 类型,因此可以用这两个函数获取大文件(指超过 2GB)的长度。

注意 Linux 和 Unix 中的 C 编译器没有提供 _fseeki64() 和 _ftelli64() 函数,但是在 stdio.h 中提供了 fseeko() 和 ftello() 函数,fseeko() 函数中表示文件指针的偏移量的变量是 off_t 类型,ftello() 的返回值也是off_t 类型,off_t 类型的长度有可能是 32 比特或 64 比特,使用宏定义 #define _FILE_OFFSET_BITS 64 可以将 off_t 设为64 比特长。

下面给出用C语言获取文件长度(可能大于 2GB)的实现示例,代码在 Windows 和 Linux 平台上都能使用(未在 Unix 上测试),包括三个文件:

第 1 个文件

/**************************************************
* File name: get_file_size.h
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: Oct 31th, 2013
* Description: declare function GetFileSize() which
can be used on platform Windows or Linux
**************************************************/ #ifndef GET_SMALL_FILE_SIZE_H
#define GET_SMALL_FILE_SIZE_H #ifdef __cplusplus
extern "C" {
#endif /**************************************************
*函数名称:GetFileSize
*功能: 获取文件的大小,结果以字节为单位
*参数:
file_name[in] 文件名
file_byte_size[in] 文件大小
*返回值:
0 成功
-1 失败
*备注:
1. 如果运行在Windows操作系统上,声明的函数只能在 Visual
Studio 2005 及更高版本上编译。
2. 该函数对实际文件大小没有限制
**************************************************/
int GetFileSize(char *file_name, long long *file_byte_size); #ifdef __cplusplus
}
#endif #endif /* end of GET_SMALL_FILE_SIZE_H */

第 2 个文件

/**************************************************
* File name: get_file_size.c
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: Oct 31th, 2013
* Description: implement function GetFileSize()
**************************************************/ #include "get_file_size.h"
#include <stdio.h> #if defined(__linux__) || defined(__unix__)
#define _FILE_OFFSET_BITS 64
#endif int GetFileSize(char *file_name, long long *file_byte_size)
{
FILE * fp; if (!(fp=fopen(file_name, "rb")))
{
#ifdef _DEBUG
printf("Open file %s failed!\n", file_name);
#endif
return (-1);
} #if defined(_WIN32) || defined(_WIN64)
#if _MSC_VER >= 1400
/***********************/
if ( _fseeki64(fp, (long long)(0), SEEK_END) )
{
#ifdef _DEBUG
printf("fseek() function failed!\n");
#endif
fclose(fp);
return (-1);
}
*file_byte_size=_ftelli64(fp);
#else
#error Visual Studio version is less than 8.0(VS 2005) !
#endif
/***********************/
#else
if (fseeko(fp, (long long)(0), SEEK_END))
{
#ifdef _DEBUG
printf("fseek() function failed!\n");
#endif
fclose(fp);
return (-1);
}
*file_byte_size=ftello(fp);
/***********************/
#endif fclose(fp);
return 0;
}

第 3 个文件

这个文件的功能是:如果在 Windows 下,尝试获取一个大文件 RedHat62.vdi (大小约为16GB)的字节长度;如果在 Linux 下,尝试获取一个大文件 cn_dvd_532347.iso (大小约为2.5GB)的字节长度,经测试发现都能够正确得到结果。

/**************************************************
* File name: get_file_size.c
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: Oct 31th, 2013
* Description: demonstrate how to invoke GetFileSize() function
**************************************************/
#include "get_file_size.h"
#include <stdio.h>
#include <stdlib.h> int main(void)
{
#if defined(_WIN32) || defined(_WIN64)
char file_name[256]="f:\\myvdisk\\RedHat62.vdi";
#else
char file_name[256]="/media/0009-EB9C/cn_dvd_532347.iso";
#endif
long long file_byte_length;
int error_code; if ( error_code=GetFileSize(file_name, &file_byte_length) )
{
printf("get file length failed!\n");
#if defined(_WIN32) || defined(_WIN64)
system("pause");
#endif
return 1;
}
else
printf("file %s length is %lld bytes.\n", file_name, file_byte_length);
#if defined(_WIN32) || defined(_WIN64)
system("pause");
#endif
return 0;
}

获取任意文件(不受 2GB 大小限制)长度还有其他的方法:例如在 Linux 平台上可以使用 stat() 函数,该 函数返回的结构体 stat 中包含一个成员变量 st_size,它表示文件的字节长度,类型为 off_t。

在 Visual Studio 2005 及以后版本的开发工具中提供了 _stat64() 函数,该函数返回的结构体 _stat64 中包含一个成员变量 st_size,它表示文件的字节长度,类型为 __int64。

用C语言获取任意文件的长度(可能大于2GB)的更多相关文章

  1. 用C语言获取任意文件的长度(可能大于2GB)#define _FILE_OFFSET_BITS 64

    打开文件后用 fseek() 函数把文件位置指针移动到文件的末尾,用 ftell() 获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.但是这样做也会受到下面的限制:ftell() 函数的返 ...

  2. PHP任意文件上传漏洞CVE-2015-2348浅析

    昨晚安全新闻爆出一个“PHP任意文件上传漏洞”,CVE编号为:CVE-2015-2348. 当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多 ...

  3. 网络安全-企业环境渗透2-wordpress任意文件读&&FFmpeg任意文件读

    参考 http://prontosil.club/posts/c08799e1/ 一. 实验名称 企业环境渗透2 二. 实验目的 [实验描述] 操作机的操作系统是kali 进入系统后默认是命令行界面 ...

  4. 【原创】JEECMS v6~v7任意文件上传漏洞(1)

    文章作者:rebeyond 受影响版本:v6~v7 漏洞说明: JEECMS是国内Java版开源网站内容管理系统(java cms.jsp cms)的简称.该系统基于java技术开发,继承其强大.稳定 ...

  5. 应用服务器Glassfish任意文件读取漏洞

    catalogue . 前言和技术背景 . Glassfish安装配置 . 漏洞利用 . 漏洞缓解(修复) 1. 前言和技术背景 0x1: GlassFish是什么 GlassFish 是用于构建 J ...

  6. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  7. Linux 在 i 节点表中的磁盘地址表中,若一个文件的长度是从磁盘地址表的第 1 块到第 11 块 解析?

    面试题: 在 i 节点表中的磁盘地址表中,若一个文件的长度是从磁盘地址表的第 1 块到第 11块,则该文件共占有 B  块号.A 256 B 266 C 11 D 256×10 linux文件系统是L ...

  8. 中国电信某站点JBOSS任意文件上传漏洞

    1.目标站点 http://125.69.112.239/login.jsp 2.简单测试 发现是jboss,HEAD请求头绕过失败,猜测弱口令失败,发现没有删除 http://125.69.112. ...

  9. 使用MSCOMM发送任意文件,还有一些注意事项

    第一步:发送文件 FILE* pSENDFILE = _wfopen(m_edit_chosefile, _T("rb"));//以二进制打开待发送文件的的文件指针 fseek(p ...

随机推荐

  1. 华为荣耀V8这个7.0的系统的root

    原文链接:http://m.shuaji.com/jiaocheng/5585.htm 已经有不少的机友的华为荣耀V8手机已经升级到EMUI5.0了,也就是现在的安卓7.0的系统,那这个时候该如何进行 ...

  2. Django基础-Lesson1

    web框架概念 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统. 对于所有的Web应用,本质上其实就是一个socket服务端, ...

  3. HAproxy 代理技术原理探究

    HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...

  4. QT学习笔记6:常见的 QGraphicsItem

    简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...

  5. hdu 5301 Buildings (2015多校第二场第2题) 简单模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...

  6. hdu 4403 爆搜

    题意:给一串数字,在其间加入若干加号和一个等号,问使等式成立的方案总数 if the digits serial is "1212", you can get 2 equation ...

  7. python开发_logging_日志处理

    在很多编程语言中,都会出现日志处理操作,python也不例外... 接下来我们来看看python中的logging模块 ''' python中,logging模块主要是处理日志的. 所谓日志,可理解为 ...

  8. Emoji表情符号录入MySQL数据库报错的解决方案

    原文:http://blog.itpub.net/26230597/viewspace-1243233/ 1,查看tomcat后台日志,核心报错信息如下:  Caused by: java.sql.S ...

  9. android软件中加入广告实现方法

    经过了一番折腾,忙忙碌碌了一下午,终于搞明白了Android软件界面嵌入广告的方法,以下我以嵌入有米广告为例小结一下: 步骤一,下载有米广告SDK,将 youmi-android.jar 导入想要嵌入 ...

  10. Selenium2+python自动化39-关于面试的题

    前言 最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下, 回答不妥的地方欢迎各位高手拍砖指点.   一.selenium中如何判断元素是否存在? 首先selen ...