首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言獲取文件大小的兩種標準方法:fseek/ftell 與 stat 結構體

     編輯:C 語言入門

方法一:標準 C 庫 fseek + ftell(可移植)

原理:將文件指針移至末尾,ftell 返回距文件開頭的字節偏移量,即文件大小。


#include <stdio.h>
#include <stdlib.h>

long get_filesize_fseek(const char *path) {
    FILE *fp = fopen(path, "rb");  // 二進制模式避免換行符轉換影響
    if (!fp) return -1;

    if (fseek(fp, 0, SEEK_END) != 0) { fclose(fp); return -1; }
    long size = ftell(fp);
    fclose(fp);
    return size;
}

int main(void) {
    long sz = get_filesize_fseek("Q.txt");
    if (sz >= 0) printf("文件大小: %ld 字節\\n", sz);
    else perror("獲取失敗");
    return 0;
}

關鍵點

  • 二進制模式 "rb":Windows 下文本模式會將 \r\n 轉為 \n,導致 ftell 值小於磁盤實際大小。
  • 返回類型 long:32 位系統最大 2GB,大文件需用 fseeko/ftello (POSIX) 或 _fseeki64 (Windows)。
  • 標準 C 兼容:ANSI C、ISO C99、POSIX、Windows 均支援。

方法二:POSIX/Windows stat 結構體(豐富元數據)

一次調用獲取大小、時間、權限、設備號等完整屬性。


#include <stdio.h>
#include <sys/stat.h>
#include <time.h>

// Linux/macOS
long get_filesize_stat(const char *path) {
    struct stat st;
    if (stat(path, &st) != 0) return -1;
    return st.st_size;
}

// Windows (MSVC/MinGW)
long get_filesize_stat_win(const char *path) {
    struct _stat st;
    if (_stat(path, &st) != 0) return -1;
    return st.st_size;
}

int main(void) {
    struct _stat buf;
    if (_stat("Q.txt", &buf) == 0) {
        printf("大小: %ld\\n", buf.st_size);
        printf("磁盤: %c:\\n", buf.st_dev + 'A');
        printf("創建時間: %s", ctime(&buf.st_ctime));
        printf("修改時間: %s", ctime(&buf.st_mtime));
        printf("訪問時間: %s", ctime(&buf.st_atime));
    } else perror("stat失敗");
    return 0;
}

stat 關鍵字段

字段含義
st_size文件大小(字節)
st_dev所在設備號
st_inoinode 號
st_mode權限與類型
st_uid/st_gid所有者用戶/組 ID
st_atime最後訪問時間
st_mtime最後修改時間
st_ctime狀態改變時間(Windows 為創建時間)

方案選擇指南

場景推薦理由
僅需大小、跨平台fseek/ftell純標準 C,無平台依賴
需時間/權限/設備等元數據stat一次調用全拿,避免多次系統調用
大文件 > 2GB (32位)fseeko/ftello 或 _fseeki6464 位偏移量
高性能、避免打開文件stat無需 fopen,僅元數據查詢

避坑提醒

  • 文本模式 fopen(path, "r") 導致 ftell 不準 —— 永遠用 "rb"。
  • ftell 返回 -1L 表示出錯,需檢查 errno。
  • Windows _stat 與 POSIX stat 結構體字段基本對應,但時間語義略異(st_ctime)。
  • 目錄對 stat 也成功,但 st_size 語義不同(通常為塊大小),勿作為文件大小判斷依據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved