FileInfo.Length 是获取文件大小最常用、最可靠的方式,返回 long 类型字节数,需配合 Exists 判断和异常处理,不提供单位换算或越权访问能力。

用 FileInfo.Length 最直接,但要注意返回的是字节不是“KB/MB”
获取文件大小最常用、最可靠的方式就是 FileInfo.Length,它返回 long 类型的字节数。别被名字误导——它不叫“Size”,也不返回格式化字符串,就是纯字节值。
常见错误是直接拿这个值当“显示大小”用,结果用户看到 1048576 而不是 “1 MB”。这不是 bug,是设计如此。
-
FileInfo构造函数需要完整路径,传相对路径时注意当前工作目录可能不是你预期的 - 如果文件不存在,
FileInfo实例能创建成功,但访问Length会抛FileNotFoundException - 对符号链接(Windows 上的 junction 或 mklink),
Length返回目标文件大小,不是链接本身元数据大小
var info = new FileInfo(@"C:datalog.txt");
if (info.Exists) {
long bytes = info.Length; // ✅ 正确:先检查 Exists 再读 Length
}
FileInfo 和 File.GetAttributes 都不能绕过权限检查
哪怕只是想看看大小,.NET 仍需读取文件系统元数据。如果进程没权限访问该文件(比如 NTFS 权限拒绝、文件被其他进程独占锁住),FileInfo.Length 就会炸——不是返回 0,而是直接抛 UnauthorizedAccessException 或 IOException。
- 不要用
try/catch包裹Length当“存在性判断”,成本高且掩盖真实意图 - 想静默跳过无权文件?先用
File.GetAccessControl()检查权限(开销更大),或直接 catch 并忽略特定异常类型 -
File.GetAttributes(path)不触发权限检查,但它不提供大小;仅靠它无法替代FileInfo
大文件下 FileInfo.Length 没性能问题,但别和 Stream.Length 混用
FileInfo.Length 是从文件系统读取的元数据,跟文件内容无关,无论 GB 级还是 KB 级,耗时几乎一样。真正容易踩坑的是把它和流操作混在一起。
- 打开
FileStream后调stream.Length—— 如果流是只写的、或以FileMode.Append打开,会抛NotSupportedException -
MemoryStream.Length是内存中字节数,和磁盘文件完全无关,别误以为它能替代FileInfo - 如果文件正在被写入(如日志追加),
FileInfo.Length返回的是当前已写入的字节数,不是“最终大小”——这点常被忽略
跨平台时注意 FileInfo 对长路径和特殊字符的处理差异
Windows 默认支持长路径(>260 字符),但 .NET 5+ 默认启用长路径支持前,FileInfo 构造失败会静默截断或抛 ArgumentException;Linux/macOS 下路径分隔符是 /,但 FileInfo 内部会自动 Normalize,所以用 \ 也没问题。
- 路径含
?、*、等非法字符时,<code>FileInfo构造不报错,但访问Length会抛DirectoryNotFoundException(因为解析失败) - 在容器或网络挂载卷(如 WSL2 的 /mnt/c)上,某些文件系统(如 exFAT)可能不精确报告大小,
Length值偶尔偏小 - 别依赖
FileInfo.ToString()输出来提取大小——它返回的是路径字符串,不是格式化信息
FileInfo.Length,但必须配合 Exists 判断和异常防护,别指望它帮你做单位换算或越权访问。


















