C#写入文件方法 C#怎么向文件写入字符串

1次阅读

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

C#写入文件方法 C#怎么向文件写入字符串

File.WriteAllText 最快写入单个字符串

如果只是把一串文本完整覆盖写入一个文件,File.WriteAllText 是最直接的选择。它自动处理编码(默认 UTF-8)、创建目录、覆盖旧文件,一行搞定。

常见错误:传入空路径或父目录不存在,会抛出 DirectoryNotFoundException;传入 NULL 字符串会写入空文件,但不会报错。

  • File.WriteAllText("log.txt", "Hello World"); —— 写入当前目录
  • File.WriteAllText(@"C:tempoutput.json", jsonStr); —— 注意路径中的反斜杠要转义或用 @ 前缀
  • 如需指定编码(比如 GB2312),第三个参数传 Encoding.GetEncoding("GB2312")

追加内容用 File.AppendAllText

日志记录、持续写入场景下,不能每次覆盖,得追加。这时 File.AppendAllText 自动打开文件末尾、写入、关闭,比手动开流更安全。

注意:它不自动换行。如果希望每条记录独占一行,得自己加 rn

  • File.AppendAllText("app.log", $"[{DateTime.Now}] Error: {msg}rn");
  • 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 类静态方法扛不住,得上文件锁或改用数据库、消息队列这类有并发语义的方案。

text=ZqhQzanResources