首页 > C/C++/Linux > Linux系统上大文件读写支持

Linux系统上大文件读写支持

2009-07-23 15:24 星期四    浏览: 1,739    绿 发表评论 阅读评论

引子/症状:复制文件时,在开始调用stat(file, &filestat)时,返回-1,获取文件状态信息失败,打出的错误号为75,意思是EOVERFLOW。而在PC上进行命令行和图形界面的复制均正常,板子上对该多媒体文件播放也正常。无论在PC还是在板子上,stat调用都返回-1。

  从上述症状可以看出,该文件的存储介质以及读写均正常。问题出在stat调用上,后结合该文件大于2GB,发现问题来自于stat对大文件(大于2GB)的不支持。

命令行的stat支持该大文件,但不存在stat64的命令行程序。

若要支持大文件,需改用stat64()函数调用和struct stat64结构体。对于文件的open,也需fopen64。读写fread/fwrite则添加宏:

#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64

即可,不需采用64位的版本。采样define宏定义修改stat/fopen即可:

#ifdef _LARGEFILE64_SOURCE
#define stat stat64
#define fopen fopen64
//#define fread fread64
//#define fwrite fwrite64
#endif

 

加入上述代码后,即解决了复制大文件的问题。

 

另外,判断文件是否存在,可以使用access函数:

if(::access(filename, R_OK))
{
fprintf(stderr, “Failed to access file %s ! errno=%dn”, filename, errno);
return false;
}

 参考:

1stat() fails for large file (2GB)
http://archives.devshed.com/forums/c-c-134/stat-fails-for-large-file-2gbt-2405132.html

(2)Does fread64 and fwrite64 exist in the standard library?
http://www.daniweb.com/forums/thread95640.html#

(3)Large File Support in Linux
http://www.suse.de/~aj/linux_lfs.html

(4)fopen(), fopen64()
http://www.mkssoftware.com/docs/man3/fopen.3.asp

本文链接地址: http://blog.redwolf-soft.com/?p=603

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
分类: C/C++/Linux 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。