那曲檬骨新材料有限公司

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

    文章

    11345

    瀏覽量

    210392
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137713
  • 文件
    +關注

    關注

    1

    文章

    570

    瀏覽量

    24822
收藏 人收藏

    評論

    相關推薦

    C語言-文件編程

    這篇文章介紹C語言文件編程函數,案例代碼是在Linux環境下運行測試的分別介紹了C語言標準庫的
    的頭像 發表于 09-09 11:33 ?2071次閱讀

    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 ?1457次閱讀

    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 ?1197次閱讀

    深入探索Linux中的C語言

    Linux 中的基礎頭文件、C 語言標準以及可移植操作系統(POSIX)標準,C 語言是和
    的頭像 發表于 03-14 16:48 ?2080次閱讀

    C語言獲取文件長度的兩種方法

    C語言中沒有直接獲取文件長度的接口,但是我們可以使用標準庫提供的函數來間接的獲取文件長度。這里提
    的頭像 發表于 10-10 16:15 ?1432次閱讀
    <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 ?2783次閱讀
    百家乐官网娱乐城提款| 百家乐官网模拟分析程序| 百家乐视频游戏双扣| 百家乐官网分析软件下| 大赢家百家乐的玩法技巧和规则 | 皇冠足球比分网| 介绍百家乐官网赌博技巧| 三亚百家乐的玩法技巧和规则| 来博百家乐官网游戏| 百家乐六合彩| 百家乐官网大钱赢小钱| 大发888客户端de 软件| 万宝路百家乐官网的玩法技巧和规则 | 至尊百家乐官网| 云龙县| 豪杰百家乐现金网| 赌博百家乐官网技术| 禄丰县| 沙龙国际在线| 德州扑克排名| 大发888dafa888| 百家乐官网庄牌闲牌| 钱隆百家乐官网智能| 百家乐官网有几种打法| 百家乐技巧| 百家乐职业打| 百家乐最新破| 澳门百家乐娱乐城怎么样| 百家乐官网如何破解| 时时彩论坛| 足球走地| 金道博彩| 现金百家乐| 全讯网ra1777| 皇冠网百家乐官网啊| 百家乐官网园选| 优惠搏百家乐官网的玩法技巧和规则 | 大发888手机版下载| 全讯网即时线路| 嘉年华百家乐的玩法技巧和规则 | 百家乐官网重要心态|