前几天在工做中须要写一段代码,获取一些文件的大小,心想:这还不简单吗?直接用标准C 的文件操做函数就OK了。因而写了下面的一段代码来实现: 函数
unsigned long get_file_size(const char *filename)
{
unsigned long size;
FILE* fp = fopen( filename, “rb” );
if(fp==NULL)
{
printf(“ERROR: Open file %s failed.\n”, filename);
return 0;
}
fseek( fp, SEEK_SET, SEEK_END );
size=ftell(fp);
fclose(fp);
return size;
} 测试
没有想到的是,在程序执行后发现有的文件能正确的获取大小,而有的文件则不能正确的获取到文件大小,检查了代码,也没有发现有什么不对的地方。可是在这过程当中发现了一个问题,就是能正确获取大小的文件都是相对比较小的文件,而出现错误的都是很大的文件。因而想到会不会是由于标准C文件操做函数对超过必定大小的文件不支持所形成的呢,因而Google了一下,没想到个人猜想是正确的,标准C的文件操做函数不支持对超过2G的文件读取。 spa
问题找到了,看来只有换一种方法来实现了,由于平时不多用到标准C的一些函数,因此,又只有求助了,在看了网上很多的参考文章以后,发现调用stat函数能够正确的获得超大文件的状态信息(固然包括文件大小),因而最终实现了以下的代码: get
unsigned long get_file_size(const char *filename)
{
struct stat buf;
if(stat(filename, &buf)<0)
{
return 0;
}
return (unsigned long)buf.st_size;
} file
从写这么一个小小功能的函数能够看出,平时多积累一些计算机方面的知识真的是很重要的,同时对代码的全面测试也是至关重要的,不然,看着很正确的代码可能在某些状况下会给你带来意想不到的麻烦。 程序