您的位置:首页 >C++获取超大文件大小方法详解
发布于2026-04-11 阅读(0)
扫一扫,手机访问
_file_size 在64位程序中仍返回-1,因其内部用32位long存储大小,调用GetFileSize后强制拼接导致溢出;应改用GetFileSizeEx或跨平台_stat64。

_file_size 在 64 位程序里也返回 -1?因为 _file_size 是 Microsoft C 运行时的旧函数,内部用 long 存大小,而 long 在 Windows 上始终是 32 位(即使在 x64 编译下),最大只支持 2GB(有符号)或 4GB(无符号),超过就溢出变负数或截断。这不是编译选项或平台位数能绕过的限制。
GetFileSize(Win32 API),再把 DWORD 高低两部分强行拼成 long/D "_USE_32BIT_TIME_T=0" 或 /D "_CRT_SECURE_NO_WARNINGS",也改不了它的返回类型和底层逻辑-1,且 errno 通常为 EOVERFLOWGetFileSizeEx这是 Win32 原生支持大文件的 API,返回 LARGE_INTEGER(即 int64_t),能准确表示最大约 9EB 的文件大小。必须用它替代 _file_size。
CreateFile 打开文件,注意加 FILE_FLAG_BACKUP_SEMANTICS(对目录也有效)和 GENERIC_READ 权限GetFileSizeEx 第二个参数是指向 LARGE_INTEGER* 的指针,别传 int* 或 long long* —— 类型不匹配会导致高位丢失LARGE_INTEGER size;
HANDLE h = CreateFile(L"bigfile.bin", GENERIC_READ, FILE_SHARE_READ,
nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (h != INVALID_HANDLE_VALUE && GetFileSizeEx(h, &size)) {
int64_t bytes = size.QuadPart; // 这才是真实字节数
}
CloseHandle(h);stat64 或 stat 的 64 位变体Linux/macOS 和现代 MinGW、MSVC(带 UCRT)都支持 struct stat64 或 _stat64,它们的 st_size 字段是 off64_t(64 位),不依赖文件句柄。
_stat64(不是 _stat),头文件是 sys/stat.h;路径传窄字符(const char*)即可stat(glibc 默认启用 _FILE_OFFSET_BITS=64),或显式用 stat64struct _stat + _stat,st_size 仍是 32 位,照样溢出struct _stat64 sb;
if (_stat64("bigfile.bin", &sb) == 0) {
int64_t bytes = sb.st_size; // 安全即使函数本身支持大文件,调用仍可能失败——不是因为大小,而是访问控制或路径语义。
GetFileSizeEx 可能返回 0 或失败,需检查 GetLastError() 是否为 ERROR_NOT_SUPPORTED 或 ERROR_ACCESS_DENIED_stat64 时,默认解析符号链接;如需获取链接本身大小(而非目标),得用 _stat64 的变体(如 MinGW 的 lstat64),但 MSVC 不提供ENODATA,这时只能靠读取实际内容长度来判断
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9