关于利用fseek,ftell计算文件大小遇到的问题

内核编译和嵌入式产品的设计与开发
回复
chenxitwo
帖子: 31
注册时间: 2011-08-13 20:03

关于利用fseek,ftell计算文件大小遇到的问题

#1

帖子 chenxitwo » 2015-05-04 10:08

获取文件大小的代码如下:

代码: 全选

int getfilesize(FILE *file_HDL)
{
	int fileSize = 0;
	int ret_code;

	if(!file_HDL)
	{
		error("file handle is null!");
		return -1;
	}

	ret_code = fseek(file_HDL,0,SEEK_END);
	if(-1 == ret_code)
	{
		perror("fseek");
		return 0;
	}
	fileSize = ftell(file_HDL);
	if(-1 == fileSize)
	{
		perror("ftell");
	}
	ret_code = fseek(file_HDL,0,SEEK_SET);
	if(-1 == ret_code)
	{
		perror("fseek");
	}
	
	return fileSize;
}
调用情况

代码: 全选

        sprintf(filename_buf, "%s", "/proc/bus/usb/devices");
	file_hdl = fopen(filename_buf, "r");
	if(NULL == file_hdl)
	{
		system("mount -t usbfs none /proc/bus/usb");
		file_hdl = fopen("/proc/bus/usb/devices", "r");
		if(NULL == file_hdl)
		{
			error("fopen %s failed!\n", filename_buf);
			perror("fopen");
			goto EXIT_FAILED1;
		}
	}

	file_size =getfilesize(file_hdl);
	if(-1 == file_size)
	{
		if(0 == )
		{
			error("file is null!\n");
		}
		goto EXIT_FAILED2;
	}
通过getfilesize计算/proc/bus/usb/devices文件大小时,发现返回的结果为0(实际不等0)。
但用来计算其他普通文件时,就没有问题。

请问各位这是个什么情况?
头像
astolia
论坛版主
帖子: 6459
注册时间: 2008-09-18 13:11

Re: 关于利用fseek,ftell计算文件大小遇到的问题

#2

帖子 astolia » 2015-05-04 19:32

/proc中这类体现内核信息的文件,其数据是在你读取时根据实际情况动态生成的,并不像一般的磁盘文件将文件大小存在某处,无法不经读取就确定其数据大小
所以一般获取文件信息的函数都无法获得其大小信息,只能返回0。这就是fseek出问题的原因
对于这类文件,只能用循环不断读入数据直到EOF,再计算读出的数据量
回复