衡阳派盒市场营销有限公司

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次閱讀
    百家乐缩水软件| 德州扑克 | 百家乐网上娱乐| 申请百家乐官网会员送彩金| 在车库做生意风水| 百家乐赌博筹| 汤阴县| 百家乐官网如何切牌好| 百家乐网上真钱娱乐网| 大发娱乐场官方下载| 百家乐官网投注限额| 百家乐另类投注法| 百家乐走势图| 大地娱乐城| 真人百家乐官网作| 太阳城巧克力| 栖霞市| 2024年九运的房屋风水| 大发888官方 46| 百家乐官网鸿泰棋牌| 百家乐英皇娱乐城| 利来国际城| 凱旋门百家乐官网的玩法技巧和规则 | 百家乐娱乐网址| 清水县| 24山 分金 水口 论 吉凶| 钱大发888扑克| 怎样玩百家乐官网看路| 澳门百家乐新濠天地| 吴川市| 在线百家乐博彩网| 施秉县| 百家乐专打单跳投注法| 六合彩资料大全| 八大胜百家乐官网的玩法技巧和规则| 威尼斯人娱乐城赌博| 海立方娱乐| 百家乐澳门百家乐| 谢通门县| 百家乐打大必赢之法| 洪泽县|