You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中获取超过LONG_MAX的文件大小?

处理超过LONG_MAX的文件大小获取问题

当文件大小超出LONG_MAX时,依赖ftell()的传统方法会因为返回值类型(long)的限制而失效,以下是几种可行的解决方案:

一、使用C标准库的64位文件偏移函数(C99+)

C99引入了fseeko()和ftello(),它们使用off_t类型替代long,多数系统在定义_FILE_OFFSET_BITS=64编译宏后,off_t会被扩展为64位类型,支持超大文件。

示例代码:

#define _FILE_OFFSET_BITS 64 // 启用64位偏移,需放在头文件包含前
#include <stdio.h>

int main(int argc, char **argv) {
    FILE *fp = fopen(argv[1], "rb");
    if (!fp) {
        perror("fopen failed");
        return 1;
    }

    if (fseeko(fp, 0, SEEK_END) != 0) {
        perror("fseeko failed");
        fclose(fp);
        return 1;
    }

    off_t fsize = ftello(fp);
    if (fsize == -1) {
        perror("ftello failed");
        fclose(fp);
        return 1;
    }

    fclose(fp);
    printf("%lld\n", (long long)fsize); // 转换为long long打印,避免格式问题
    return 0;
}

二、使用平台特定API

如果需要更直接的平台原生支持,可以使用以下方法:

Windows平台

使用CreateFileW和GetFileSizeEx函数,直接获取64位文件大小:

#include <windows.h>
#include <stdio.h>

int wmain(int argc, wchar_t **argv) {
    HANDLE hFile = CreateFileW(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        printf("CreateFile failed: %lu\n", GetLastError());
        return 1;
    }

    LARGE_INTEGER fileSize;
    if (!GetFileSizeEx(hFile, &fileSize)) {
        printf("GetFileSizeEx failed: %lu\n", GetLastError());
        CloseHandle(hFile);
        return 1;
    }

    CloseHandle(hFile);
    printf("%lld\n", fileSize.QuadPart);
    return 0;
}

Linux/macOS平台

使用stat64或fstat64函数,获取包含64位大小的文件状态结构体:

#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char **argv) {
    struct stat64 st;
    if (stat64(argv[1], &st) != 0) {
        perror("stat64 failed");
        return 1;
    }

    printf("%lld\n", (long long)st.st_size);
    return 0;
}

注意事项

  • 编译时务必定义_FILE_OFFSET_BITS=64(部分系统默认已启用,但显式定义更稳妥),确保off_t和相关结构体使用64位类型。
  • 平台特定API兼容性更好,避免标准库在不同系统上的行为差异,但代码会失去跨平台性。

内容的提问来源于stack exchange,提问作者hanshenrik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:07:14