File.AppendAllText()最简单但性能差且不支持自定义编码;StreamWriter配合FileMode.Append适合频繁追加、指定编码及避免重复开闭文件,需注意线程安全与正确配置append参数。

直接用 File.AppendAllText() 最简单,但要注意编码和异常场景;如果要频繁追加或控制流,得用 StreamWriter 配合 FileMode.Append。
用 File.AppendAllText() 追加一行文本最省事
适合写日志、临时记录等轻量场景,内部自动处理文件打开/关闭和编码(默认 UTF-8)。
- 每次调用都会重新打开文件、写入、再关闭,频繁调用性能差
- 不支持自定义编码(如 GB2312),硬要改就得换方式
- 如果文件不存在,会自动创建;路径中父目录不存在则抛
DirectoryNotFoundException - 示例:
File.AppendAllText("log.txt", $"[{DateTime.Now}] 用户登录成功\r\n");
用 StreamWriter 追加并复用流对象
适合循环写入、需指定编码、或想避免反复开闭文件的场景。
- 必须显式指定
FileMode.Append和FileAccess.Write,否则可能覆盖原文件 - 推荐用
using确保Dispose()调用,否则文件句柄泄漏 - 编码需在构造时传入,比如
new StreamWriter("data.log", true, Encoding.UTF8)中第二个true表示追加 - 示例:
using (var writer = new StreamWriter("output.txt", true))<br>{<br> writer.WriteLine("新记录");<br> writer.WriteLine("另一条");<br>}
追加写入时容易踩的坑
不是所有“写文件”操作都等价,几个关键点常被忽略:
-
File.WriteAllText()会清空重写,不是追加 —— 新手误用导致数据全丢 - 多线程同时追加同一文件,
File.AppendAllText()不保证线程安全,可能乱序或截断 - 用
StreamWriter时若忘了传true(append 参数),就变成覆盖写入 - Windows 下换行用
\r\n,但WriteLine()自动处理;手动拼接字符串时别漏掉 - 路径含中文或空格一般没问题,但若权限不足(如写系统目录),会抛
UnauthorizedAccessException
真正麻烦的不是“怎么追加”,而是“什么时候该追加、要不要加锁、要不要缓冲、要不要检查磁盘空间”——这些得看具体业务场景,不能光靠一个函数名解决。










