File.WriteAllText和File.AppendAllText可满足绝大多数写入需求,前者覆盖写入(自动创建目录、UTF-8无BOM),后者追加内容;大文件或需精细控制时才用StreamWriter,并务必using包裹。

直接用 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 以上数据、边生成边写、或需要精确控制缓冲/刷新时机时,才值得手动管理流。
C编写,实现字符串摘要、文件摘要两个功能。里面主要包含3个文件: Md5.cpp、Md5.h、Main.cpp。其中Md5.cpp是算法的代码,里的代码大多是从 rfc-1321 里copy过来的;Main.cpp是主程序。
- 务必用
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。









