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

    文章

    10992

    浏览量

    206745
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128852
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
收藏 人收藏

    评论

    相关推荐

    Linux操作系统-C语言编程入门介绍在LINUX 下进行C 语言编程所需要的基础知识.在这

    Linux操作系统-C语言编程入门介绍在LINUX 下进行C 语言编程所需要的基础知识.
    发表于 12-08 09:56

    [推荐]linux下的c语言编程简介

    基本的了解。第二章从本章开始,我们将进入Linux充满挑战的C语言编程世界,首先介绍的是文本编辑器。文本编辑器可以说是计算机最基本的应用,修改设置文 件、编写程序或者建立文件都需要用到
    发表于 04-29 13:50

    汇编语言文件c语言文件连接问题

    以前做嵌入式系统移植,遇到c语言嵌汇编的问题,当时只走了捷径直接用了开发环境的优势,可以直接在c语言中嵌入汇编,可我知道这不是通用的方法,有
    发表于 04-14 08:43

    C语言入门,C语言学习方法,初学者必看

    C语言入门,C语言学习方法,初学者必看 初学C语言的朋友应该首先了解
    发表于 04-02 16:06

    请问为什么要在Linux下学习C语言

    级的语言,还更好用,学C干嘛?最后讲方法,怎么在Linux下学C?1. 下载Ubuntu,语言
    发表于 06-24 14:25

    C语言入门,C语言学习方法

    初学C语言的朋友应该首先了解C语言关键的核心概念(结构化、三个执行流程、优先级、指针、文件、共用体、函数、作用域、重载等 ),只有弄明白了这
    发表于 09-10 16:24

    为什么又说Linux驱动不是C语言

    说到Linux驱动,尤其是嵌入式Linux驱动,大家可能会望而却步,因为入门太难!很多书上或课程基本是这样的:一上来给我们展示一大堆高深莫测的代码,感觉是C语言,又感觉不是
    发表于 11-05 07:13

    Linux内核C语言示例

    00. 目录文章目录00. 目录01. C 语言标准02. C 标准内容03. C 标准的发展历程04. 编译器对 C 标准的支持05. 编
    发表于 12-15 06:46

    linux基本操作与C语言基础

    目录C语言基础C++linux基本操作io操作数据结构进程线程网络编程实战项目C语言基础基本数据类型指针结构体、联合体、枚举
    发表于 12-17 07:53

    elmfat文件系统如何获取文件大小呢?

    rtt 使用elmfat文件系统 如何获取文件大小呢 ?f_size() 无法使用,elmfat能使用fatfs里面支持的api么
    发表于 03-14 10:25

    LinuxC语言编程入门教程

    u3000本文是LinuxC 语言编程入门教程。主要介绍了Linux 的发展与特点、C语言
    发表于 09-22 06:56

    C语言怎样处理json文件?

    获取到的JSON文件,怎样通过C语言进行处理,因为单片机里面只能用C语言,有没有
    发表于 11-01 06:16

    Linux中的汇编语言

    在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这
    发表于 04-07 20:43 55次下载

    Linux基础教程之如何在linux不解压tar.gz文件查看的文件大小资料概述

    本文档的主要内容详细介绍的是Linux基础教程之如何在linux不解压tar.gz文件查看的文件大小详细程序资料免费下载。
    发表于 10-31 17:06 2次下载

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

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