0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【Linux + C语言】C语言获取文件大小的方法都在这

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-08-31 12:49 次阅读

笔者在日常项目中经常需要使用C语言求一个文件的大小,特整理了一些常用的方法,通过测试代码的形式展示出来,话不多说,直接上代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define TEST_FILE	"./IMG_3458.JPG"

// call stat() function
static int get_file_size_by_stat(const char *file)
{
	int ret;
	struct stat file_info;
	
	printf("enter %s() >>>\n", __func__);
	ret = stat(file, &file_info);
	
	return (!ret) ? file_info.st_size : -1;
}

// call lstat() function
static int get_file_size_by_lstat(const char *file)
{
	int ret;
	struct stat file_info;
	
	printf("enter %s() >>>\n", __func__);
	ret = lstat(file, &file_info);
	
	return (!ret) ? file_info.st_size : -1;
}

// call fstat() function
static int get_file_size_by_fstat(const char *file)
{
	int ret;
	int fd;
	struct stat file_info;
	
	printf("enter %s() >>>\n", __func__);
	fd = open(file, O_RDONLY);
	if (fd < 0) {
		ret = -1;
		perror("open error");
		goto exit_entry;
	}
	
	ret = fstat(fd, &file_info);
	
exit_entry:
	if (fd >= 0) {
		close(fd);
	}
	return (!ret) ? file_info.st_size : -1;
}

// call lseek() function
static int get_file_size_by_lseek(const char *file)
{
	int ret;
	int fd;
	
	printf("enter %s() >>>\n", __func__);
	fd = open(file, O_RDONLY);
	if (fd < 0) {
		ret = -1;
		perror("open error");
		goto exit_entry;
	}
	
	ret = lseek(fd, 0, SEEK_END);
	
exit_entry:
	if (fd >= 0) {
		close(fd);
	}
	return ret;
}

// call fseek() and ftell() function
static int get_file_size_by_fseek_and_ftell(const char *file)
{
	int ret;
	FILE *fp;
	
	printf("enter %s() >>>\n", __func__);
	fp = fopen(file, "r");
	if (!fp) {
		ret = -1;
		perror("fopen error");
		goto exit_entry;
	}
	
	ret = fseek(fp, 0, SEEK_END);
	if (ret < 0) {
		ret = -1;
		perror("fseek error");
		goto exit_entry;	
	}
	
	ret = ftell(fp);
	
exit_entry:
	if (fp) {
		fclose(fp);
	}
	return ret;
}

static int shell_cmd_excute(const char *cmd, char *result, int size)
{
	int ret;
	FILE *fp;
	
	fp = popen(cmd, "r");
	if (!fp) {
		ret = -1;
		perror("popen error");
		goto exit_entry;
	}
	
	ret = fread(result, 1, size, fp);
	if (ret < 0) {
		ret = -1;
		perror("fseek error");
		goto exit_entry;	
	}
	
	ret = 0;
exit_entry:
	if (fp) {
		pclose(fp);
	}
	return ret;
}

// call shell cmd
static int get_file_size_by_shell_cmd(const char *file)
{
	int ret;
	char cmd[128];
	char result[16];
	
	printf("enter %s() >>>\n", __func__);
	snprintf(cmd, sizeof(cmd), "ls -al %s | awk '{print $5}'", file);
	printf("shell cmd: %s\n", cmd);
	
	ret = shell_cmd_excute(cmd, result, sizeof(result));
	if (!ret && strlen(result)) {
		ret = atoi(result);
	}
	
	return ret;
}

int main(int argc, const char *argv[])
{
	int file_size;
	
	printf("enter %s() >>>\n", __func__);
	
	file_size = get_file_size_by_stat(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);
	
	file_size = get_file_size_by_lstat(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);
	
	file_size = get_file_size_by_fstat(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);
	
	file_size = get_file_size_by_lseek(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);
	
	file_size = get_file_size_by_fseek_and_ftell(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);	
	
	file_size = get_file_size_by_shell_cmd(TEST_FILE);
	printf("file_size=%d\n\n\n", file_size);
	
	return 0;
}

测试记录如下:

被测试文件,在windows下查看大小为:

img

如上测试代码,编译出来,运行结果如下所示,测试证明,所有的获取方法均是有效的。

img

好了,本次使用C语言获取文件大小的方法就介绍到这里,如果你有更加方便、快捷、高效的方法,也可以在评论席告知,感激不尽。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11202

    浏览量

    208695
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135803
  • 文件
    +关注

    关注

    1

    文章

    561

    浏览量

    24663
收藏 人收藏

    评论

    相关推荐

    C语言-文件编程

    这篇文章介绍C语言文件编程函数,案例代码是在Linux环境下运行测试的分别介绍了C语言标准库的
    的头像 发表于 09-09 11:33 1972次阅读

    Linux操作系统-C语言编程入门-pdf

    Linux操作系统-C语言编程入门介绍在LINUX 下进行C 语言编程所需要的基础知识.
    发表于 12-08 09:55 193次下载
    <b class='flag-5'>Linux</b>操作系统-<b class='flag-5'>C</b><b class='flag-5'>语言</b>编程入门-pdf

    linuxc语言编程pdf

    linuxc语言编程内容为::基础知识,进程介绍,文件操作,时间概念,信号处理,消息管理,线程操作,网络编程,Linux
    发表于 12-08 10:00 0次下载

    C语言和汇编语言混合编程方法C语言中断处理方法

    C语言和汇编语言混合编程方法C语言中断处理方法,n
    发表于 01-06 14:36 36次下载

    C语言教程之获取当前日期与时间

    C语言教程之获取当前日期与时间,很好的C语言资料,快来学习吧。
    发表于 04-25 16:09 0次下载

    C语言教程之获取CMOS密码

    C语言教程之获取CMOS密码,很好的C语言资料,快来学习吧。
    发表于 04-25 16:49 0次下载

    C语言教程之获取Ctrl+Break消息

    C语言教程之获取Ctrl+Break消息,很好的C语言资料,快来学习吧。
    发表于 04-25 17:07 0次下载

    C语言教程之获取Caps Lock键状态

    C语言教程之获取Caps Lock键状态,很好的C语言资料,快来学习吧。
    发表于 04-25 17:07 0次下载

    C语言教程之获取环境变量

    C语言教程之获取环境变量,很好的C语言资料,快来学习吧。
    发表于 04-25 17:07 0次下载

    linux中编译c语言方法

    以上就是linux中如何编译c语言的详细内容。
    发表于 06-09 08:58 1411次阅读

    LinuxC语言编程入门教程详细说明

    本文是LinuxC 语言编程入门教程。主要介绍了Linux 的发展与特点、C语言的基础知识、
    发表于 08-25 18:05 39次下载
    <b class='flag-5'>Linux</b>下<b class='flag-5'>C</b><b class='flag-5'>语言</b>编程入门教程详细说明

    C语言_Linux基本命令与C语言基础

    这篇文章介绍在Linux环境下学习C语言搭建基本的环境过程,了解基础的几个命令使用方法,了解Linux下用户权限配置,标准main函数传参方
    的头像 发表于 08-14 09:45 1112次阅读

    深入探索Linux中的C语言

    Linux 中的基础头文件C 语言标准以及可移植操作系统(POSIX)标准,C 语言是和
    的头像 发表于 03-14 16:48 1573次阅读

    C语言获取文件长度的两种方法

    C语言中没有直接获取文件长度的接口,但是我们可以使用标准库提供的函数来间接的获取文件长度。这里提
    的头像 发表于 10-10 16:15 1280次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>获取</b><b class='flag-5'>文件</b>长度的两种<b class='flag-5'>方法</b>

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件获取一些有用的信息或者对程
    的头像 发表于 09-02 10:37 1154次阅读