Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155124
  • 博文数量: 19
  • 博客积分: 901
  • 博客等级: 准尉
  • 技术积分: 268
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-14 23:58
文章分类

全部博文(19)

文章存档

2010年(19)

我的朋友

分类: C/C++

2010-06-30 12:31:30

在我们学习生活中经常会遇到问题和困难,就比如说我们在学习Linux时,比如怎样Linux获取文件大小的方法。前几天在工作中需要写一段代码,获取一 些视频文件的大小,心想:这还不简单吗?直接用标准C的文件操作函数就OK了。于是写了下面的一段代码来实现:

1. unsigned long get_file_size(const char *filename)
   2. {
   3. unsigned long size;
   4. FILE* fp = fopen( filename, "rb" );
   5. if(fp==NULL)
   6. {
   7. printf("ERROR: Open file %s failed.\n", filename);
   8. return 0;
   9. }
  10. fseek( fp, SEEK_SET, SEEK_END );
  11. size=ftell(fp);
  12. fclose(fp);
  13. return size;
  14. }


没有想到的是,在程序执行后发现有的文件能正确的获取大小,而有的文件则不能正确的获取到文件大小,检查了代码,也没有发 现有什么不对的地方。但是在这过程中发现了一个问题,就是能正确获取大小的文件都是相对比较小的文件,而出现错误的都是很大的文件。于是想到会不会是因为 标准 C文件操作函数对超过一定大小的文件不支持所造成的呢,于是Google了一下,没想到猜测是正确的,标准C的文件操作函数不支持对超过2G的文件读取。

问题找到了,看来只有换一种方法来实现了,因为平时很少用到标准C的一些函数,所以,又只有求助于Google了,在看了 网上不少的参考文章之后,发现调用stat函数可以正确的得到超大文件的状态信息(当然包括文件大小),于是最终实现了如下的代码:


1. unsigned long get_file_size(const char *filename)
   2. {
   3. struct stat buf;
   4. if(stat(filename, &buf)<0)
   5. {
   6. return 0;
   7. }
   8. return (unsigned long)buf.st_size;
   9. }


从写这么一个小小功能的函数可以看出,平时多积累一些计算机方面的知识真的是很重要的,同时对代码的全面测试也是相当重要的,否则,看着很正确的代码可能 在某些情况下会给你带来意想不到的麻烦。 这样你就能学会Linux获取文件大小的方法了。
阅读(1469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~