File.WriteAllText最快覆盖写入单字符串,自动处理UTF-8 BOM编码,不创建目录需预建,错误抛异常;StreamWriter适合多行、指定编码和流式写入,须using防泄漏;AppendAllText仅适合低频单线程日志追加。
用 File.WriteAllText 最快写入单个字符串
直接覆盖写入,适合保存配置、日志片段或一次性结果。它自动处理编码(默认 utf-8 bom),不用手动开闭流,出错就抛异常,不静默失败。
常见错误现象:UnauthorizedAccessException(路径无写权限)、DirectoryNotFoundException(父目录不存在)。
- 确保目标目录已存在,
File.WriteAllText不会自动创建中间目录,得先调用Directory.CreateDirectory - 如果想追加而非覆盖,别用这个,换
File.AppendAllText - 写入敏感内容(如密码)后,注意文件系统权限,别让其他用户可读
File.WriteAllText(@"C:dataconfig.txt", "server=local;port=8080");
用 StreamWriter 控制编码和逐行写入
当需要指定编码(比如 GB2312)、写入多行、或边生成边写(避免内存堆积大字符串)时,StreamWriter 更灵活。它底层封装了 FileStream,但比裸用流更简洁。
使用场景:导出 CSV、生成脚本文件、实时日志写入。
- 务必用
using包裹,否则文件句柄可能泄漏,后续再写会报IOException: The process cannot access the file - 编码不匹配会导致乱码,中文环境常用
Encoding.UTF8或Encoding.GetEncoding("GB2312") - 写入超大文本时,避免先拼接整个字符串再传给
WriteLine,改用多次WriteLine
using (var writer = new StreamWriter(@"D:log.txt", false, Encoding.UTF8))<br>{<br> writer.WriteLine("Start at " + DateTime.Now);<br> writer.WriteLine("Status: OK");<br>}
File.AppendAllText 适合日志累加,但要注意并发
每次调用都打开→写入→关闭文件,语义清晰,适合低频日志追加。但它不是线程安全的——多个线程同时调用,可能丢行或内容错乱。
错误现象:日志文件里某几行“粘连”在一起、时间戳顺序错乱、甚至部分文字被截断。
- 单线程场景下放心用,参数和
WriteAllText一样,只是第三个参数是追加开关(bool) - 多线程/多进程写同一文件?必须加锁(如
lock+ 静态对象),或改用TextWriter.Synchronized包装 - 高频写入(如每毫秒一次)会拖慢性能,磁盘 I/O 成瓶颈,此时应考虑缓冲+批量落盘
File.AppendAllText(@"C:ppdebug.log", $"[{DateTime.Now}] Error: {ex.Message}
");路径里的反斜杠和相对路径容易踩坑
C# 字符串里 是制表符,
是换行——如果你写 "C: emplog.txt",实际路径是 C:(tab)emp(log.txt,必然失败。
- 要么用逐字字符串:
@"C: emplog.txt" - 要么双写反斜杠:
"C:\temp\log.txt" - 相对路径基于
Environment.CurrentDirectory,不是 exe 所在目录;要用AppContext.BaseDirectory获取程序根路径 - 用户文档目录推荐用
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),别硬写C:Users...
最隐蔽的问题:路径含非法字符(< > : " / | ? *)或过长(Windows 单路径上限约 260 字符),ArgumentException 或 PathTooLongException 就来了。










