File.ReadAllText适合读取几KB至1MB的小文本文件,自动编码检测但需显式指定Encoding防乱码;超10MB应改用StreamReader逐行读取以控内存;异步读取避免阻塞;路径、权限与编码问题比读取方式更关键。

用 File.ReadAllText 最快读小文件,但别碰大文件
小文本(几 KB 到 1MB)直接用 File.ReadAllText,一行搞定,编码也自动猜;超过 10MB 就容易爆内存,因为整个内容会一次性加载进 string。它默认用 UTF-8,但如果文件是 GBK 或 UTF-16,不指定编码就会乱码。
- 明确指定编码更稳妥:
File.ReadAllText("log.txt", Encoding.UTF8)或Encoding.Default(Windows 系统 ANSI) - 路径含中文或空格没问题,.NET Core / .NET 5+ 已原生支持
- 如果文件不存在,抛出
FileNotFoundException,不是返回 null —— 必须 try/catch 或先File.Exists
StreamReader 逐行读大文件,内存友好但得手动管理
处理日志、CSV 或几百 MB 的纯文本时,StreamReader 是标准解法:它按需读取缓冲区,内存占用稳定在几 KB。但它是 IDisposable,不 using 就可能锁住文件或泄漏句柄。
- 必须用
using包裹:using (var reader = new StreamReader("data.txt", Encoding.UTF8)) { string line; while ((line = reader.ReadLine()) != null) { // 处理 line } } -
ReadLine()会自动去掉换行符;ReadToEnd()又变回全量加载,慎用 - 如果文件含 BOM,
StreamReader默认能识别;没 BOM 且编码未知,得靠第三方库(如Ude)探测
异步读取避免 UI 冻结或 ASP.NET 请求超时
WinForms/WPF 主线程或 ASP.NET 同步接口里调 File.ReadAllText,界面会卡死,HTTP 请求可能 30 秒就超时。这时必须上 ReadAllTextAsync 或 StreamReader.ReadLineAsync。
- .NET 4.5+ 支持:
await File.ReadAllTextAsync("config.txt"),简单场景首选 - 逐行异步处理大文件:
await reader.ReadLineAsync(),注意不能在while条件里直接 await(语法不允许),要拆成两步 - 异步方法不改变编码逻辑,该传
Encoding还得传
路径错误和权限问题最常导致“找不到文件”
报 FileNotFoundException 不代表文件真丢了,八成是路径写错或权限不够。相对路径在不同启动环境下解析结果不同,比如双击 exe 和从 VS 启动,Directory.GetCurrentDirectory() 可能指向不同位置。
- 用绝对路径调试:
Path.GetFullPath("data.txt")看实际找的是哪 - 检查文件是否被其他程序占用(如 Excel 正打开该 TXT),会导致
IOException - ASP.NET 应用池账户默认无权访问 C:\ 或桌面路径,得放
wwwroot下或配 ACL


















