如何在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
相关产品推荐
相关产品推荐

