C# 写入文件方法 C#如何实现写入文件

来源:这里教程网 时间:2026-02-21 17:40:19 作者:

直接用

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 以上数据、边生成边写、或需要精确控制缓冲/刷新时机时,才值得手动管理流。

务必用
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

相关推荐