推荐使用C++17的std::filesystem::file_size,跨平台、安全简洁;旧标准可用fseek+ftell但有大小限制和可移植性问题。

在C++中获取文件大小,推荐使用标准库 (C++17起支持),它跨平台、简洁安全。若需兼容旧标准(如C++11),也可用 fseek + ftell 或系统API(如 stat),但可移植性较差。
✅ 推荐方式:C++17 std::filesystem::file_size
这是最现代、最直接的方法,只需一行核心代码,自动处理路径、权限和错误。
示例代码:
#include#include int main() { try { auto size = std::filesystem::file_size("example.txt"); std::cout << "文件大小:" << size << " 字节\n"; } catch (const std::filesystem::filesystem_error& e) { std::cerr << "获取文件大小失败:" << e.what() << '\n'; } return 0; }
说明:
立即学习“C++免费学习笔记(深入)”;
- 返回类型为
std::uintmax_t,能表示超大文件(如 >2GB) - 若文件不存在、无读取权限或不是普通文件,会抛出
filesystem_error异常,务必捕获 - 支持相对路径和绝对路径,自动适配不同操作系统(Windows/Linux/macOS)
⚠️ 兼容旧标准:C标准库(fseek + ftell)
适用于 C++11/14 且不启用 的环境,但有局限性(如无法处理大于 2GB 的文件在32位系统上)。
示例代码:
#include#include long getFileSize(const char path) { FILE f = std::fopen(path, "rb"); if (!f) return -1; if (std::fseek(f, 0, SEEK_END) != 0) { std::fclose(f); return -1; } long size = std::ftell(f); std::fclose(f); return size; }
int main() { long sz = getFileSize("example.txt"); if (sz >= 0) { std::cout << "文件大小:" << sz << " 字节\n"; } else { std::cerr << "无法获取文件大小\n"; } return 0; }
注意点:
- 必须以二进制模式(
"rb")打开,避免文本模式换行符转换干扰偏移 -
ftell返回long,在某些平台最大仅支持 ~2GB;64位系统可用_ftelli64(Windows)或off_t+fseeko(POSIX),但非标准 - 需手动检查每一步的返回值,健壮性不如
filesystem
? 补充:判断是否为常规文件(避免目录/符号链接误判)
仅靠 file_size 可能对目录或设备文件抛异常。如需提前验证,可结合 is_regular_file:
namespace fs = std::filesystem;
if (fs::exists("example.txt") && fs::is_regular_file("example.txt")) {
auto size = fs::file_size("example.txt");
// 安全使用 size
}这样可避免因传入目录导致异常,逻辑更清晰。
? 小结:选哪种?
优先用 std::filesystem::file_size —— 简洁、安全、跨平台,只要编译器支持 C++17(GCC 8+、Clang 7+、MSVC 2017 15.7+)。项目需兼容老编译器时,再考虑 C 标准库方案,并注意大文件和错误处理细节。










