做C#开发时,经常要跟文件打交道:读配置、保存日志、导出Excel、批量处理用户上传的图片……这些事看似简单,但一不留神就容易出错——比如文件被占用、路径拼错、编码乱码、权限不足,或者忘了关流导致内存泄漏。
先搞清两个核心命名空间
大部分文件操作都离不开这两个命名空间:
using System.IO;
using System.Text;
别漏掉 System.Text,尤其处理中文内容时,编码问题最容易翻车。
快速读取一个文本文件
想读取整个文件内容?File.ReadAllText 最省心:
string content = File.ReadAllText(@"C:\temp\note.txt", Encoding.UTF8);
注意:如果文件不大(比如几百KB以内),用这个没问题;但如果文件超大(比如几百MB的日志),建议用 StreamReader 逐行读,避免一次性占满内存。
逐行读取大文件
比如处理服务器每天生成的 access.log:
using (var reader = new StreamReader(@"D:\logs\access.log", Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.Contains("404"))
{
Console.WriteLine(line);
}
}
}
这里用了 using 自动释放资源,不用手动调 reader.Close(),安全又省事。
写入文本文件(覆盖或追加)
覆盖写入:
File.WriteAllText(@"C:\temp\report.txt", "今日统计:成功32次,失败5次", Encoding.UTF8);
追加内容(比如记录日志):
File.AppendAllText(@"C:\temp\app.log", $"[{DateTime.Now:HH:mm:ss}] 用户登录失败\r\n", Encoding.UTF8);
检查文件是否存在、创建目录
别急着操作,先判断再动手:
string filePath = @"C:\data\config.json";
if (!File.Exists(filePath))
{
Console.WriteLine("配置文件丢失,正在生成默认配置...");
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
File.WriteAllText(filePath, "{\"theme\":\"dark\"}", Encoding.UTF8);
}
Path.GetDirectoryName 能自动提取路径中的文件夹部分,配合 Directory.CreateDirectory,哪怕多层目录不存在也能一次建好。
复制、移动、删除文件
系统级操作,一行一个事:
// 复制并覆盖
File.Copy(@"C:\source\data.xlsx", @"D:\backup\data_2024.xlsx", true);
// 移动(即剪切)
File.Move(@"C:\temp\temp.csv", @"C:\done\processed.csv");
// 删除(不进回收站)
File.Delete(@"C:\temp\old.tmp");
注意:File.Copy 第三个参数设为 true 才能覆盖同名文件,否则会报异常。
小技巧:路径拼接别硬拼字符串
别这么写:@"C:\user\" + username + "\data.txt"——遇到用户名含反斜杠或空格就崩。
换成这个更稳:
string path = Path.Combine(@"C:\users", username, "data.txt");
Path.Combine 会自动处理斜杠方向、去重、清理空段,Windows/macOS/Linux 全兼容。
最后提醒一句
在Web项目(比如ASP.NET Core)里操作文件,别直接写绝对路径如 C:\temp。要用 IWebHostEnvironment.WebRootPath 或 IWebHostEnvironment.ContentRootPath 拿真实路径,不然部署到Linux服务器就找不着家了。