XML | HTML | TXT
您当前位置:软件开发 >> 新闻动态 >> 软件开发技术 >> 浏览文章

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

用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 上测试):

 

[cpp]  

/************************************************** 

* 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 */  


手机:18678812288 E-Mail:1069706080@qq.com
地址:山东省济南市舜耕路泉城公园东门园内向北50米 鲁ICP备07011972号 版权所有2008-2013 山东赢德信息科技有限公司