直接用
File.WriteAllText或
File.AppendAllText就能完成绝大多数写入需求,不需要手动开流、关流,更不容易出错。
写入新文件或覆盖已有内容用 File.WriteAllText
这是最常用、最安全的写入方式,自动处理编码、流打开/关闭和异常清理。
默认使用 UTF-8 编码(不含 BOM),如果需要带 BOM,得显式传Encoding.UTF8并注意 .NET 版本差异 路径不存在时会自动创建目录(仅限 .NET 6+;旧版本需先调用
Directory.CreateDirectory) 目标文件已存在则**完全覆盖**,不会追加 内容为空字符串也会生成一个空文件
File.WriteAllText(@"C:\logs\report.txt", "操作成功,时间:" + DateTime.Now);
追加内容到文件末尾用 File.AppendAllText
适合日志记录等场景,比手动打开
StreamWriter更轻量。 文件不存在会自动创建 每次调用都在末尾添加内容,不换行 —— 如果需要换行,得自己拼
"\n"或
Environment.NewLine同样默认 UTF-8(无 BOM),如需指定编码,第二个参数传
Encoding实例
File.AppendAllText(@"C:\logs\app.log", $"[INFO] {DateTime.Now}: 用户登录\n");大文件或需控制写入节奏时才用 StreamWriter
当你要写入几 MB 以上数据、边生成边写、或需要精确控制缓冲/刷新时机时,才值得手动管理流。
务必用using包裹,否则可能锁住文件或丢失最后缓冲区内容 不要在循环里反复调用
File.WriteAllText,性能极差;改用单个
StreamWriter写多次
AutoFlush = true会让每次
WriteLine都刷磁盘,慢但安全;默认 false 更快,但崩溃可能丢最后几 KB
using (var sw = new StreamWriter(@"C:\data\export.csv", append: true))
{
sw.WriteLine("id,name,amount");
foreach (var item in data)
{
sw.WriteLine($"{item.Id},{item.Name},{item.Amount}");
}
}常见错误:中文乱码、文件被占用、权限不足
乱码基本是编码没对齐:比如用记事本打开时默认按 ANSI 解码,但 C# 写的是 UTF-8(无 BOM),就显示为乱码。解决方案:
写入时明确指定Encoding.UTF8(.NET 5+ 默认就是它,但显式写更稳) 若必须兼容老旧记事本,改用
Encoding.Default(即系统 ANSI 编码),但跨机器不可靠 “文件正由另一进程使用”通常是因为前一次
StreamWriter没走完
using就异常退出,或忘了
Close()/
Dispose()“拒绝访问”多因路径在受保护目录(如
C:\Program Files),应改用
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
真正要注意的是:别为了“看起来更底层”而绕开
File.WriteAllText,它的封装已经足够健壮;只有当你明确需要控制流生命周期、缓冲策略或写入位置时,才该碰
StreamWriter。
