file.writealltext 是覆盖写入单个字符串的最快方式,自动处理编码、目录创建和文件覆盖;追加用 file.appendalltext;高并发或大文件需用 streamwriter 配合 using 和显式编码。

用 File.WriteAllText 最快写入单个字符串
如果只是把一串文本完整覆盖写入一个文件,File.WriteAllText 是最直接的选择。它自动处理编码(默认 UTF-8)、创建目录、覆盖旧文件,一行搞定。
常见错误:传入空路径或父目录不存在,会抛出 DirectoryNotFoundException;传入 null 字符串会写入空文件,但不会报错。
-
File.WriteAllText("log.txt", "Hello World");—— 写入当前目录 -
File.WriteAllText(@"C:\temp\output.json", jsonStr);—— 注意路径中的反斜杠要转义或用@前缀 - 如需指定编码(比如 GB2312),第三个参数传
Encoding.GetEncoding("GB2312")
追加内容用 File.AppendAllText
日志记录、持续写入场景下,不能每次覆盖,得追加。这时 File.AppendAllText 自动打开文件末尾、写入、关闭,比手动开流更安全。
注意:它不自动换行。如果希望每条记录独占一行,得自己加 \r\n。
C编写,实现字符串摘要、文件摘要两个功能。里面主要包含3个文件: Md5.cpp、Md5.h、Main.cpp。其中Md5.cpp是算法的代码,里的代码大多是从 rfc-1321 里copy过来的;Main.cpp是主程序。
File.AppendAllText("app.log", $"[{DateTime.Now}] Error: {msg}\r\n");- 和
WriteAllText一样,路径不存在时会抛异常,建议提前用Directory.CreateDirectory确保父目录存在 - 高并发写同一文件时,这个方法不是线程安全的,可能丢数据——此时必须改用
StreamWriter配合锁或ConcurrentQueue缓冲
需要控制格式、性能或大文件时,用 StreamWriter
当你要多次写入、写入对象序列化结果、或控制换行/缩进(比如 JSON 格式化),或者文件很大怕内存爆掉,就得用 StreamWriter 手动管理流。
关键点:必须 using 或显式 Dispose(),否则文件句柄不释放,后续写入会报“文件正由另一进程使用”。
-
using (var sw = new StreamWriter("data.csv", true)) { sw.WriteLine("a,b,c"); }—— 第二个参数true表示追加 - 写入中文时,推荐显式指定编码:
new StreamWriter(path, false, Encoding.UTF8) - 频繁小写入(比如每秒上百次)时,启用缓冲:
sw.AutoFlush = false;,最后调sw.Flush(),能明显提升吞吐
写入失败的典型原因和检查顺序
写不进去?别急着重写逻辑,先按这个顺序排查:
- 路径是否含非法字符(
: " | ? *)或长度超 260(Windows 默认限制)?试试短路径如"test.txt" - 目标文件是否被其他程序(记事本、VS、杀毒软件)独占打开?关掉再试
- 权限够不够?特别是写入
C:\Program Files或网络路径时,普通用户常被拒绝 - 磁盘是否满、只读?检查
DriveInfo或用File.GetAttributes(path)看是否含ReadOnly
真正难搞的是多线程/多进程同时写同一文件——这时候光靠 File 类静态方法扛不住,得上文件锁或改用数据库、消息队列这类有并发语义的方案。









