在 C# 中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件)。以下是 6 种主流方法及其适用场景:
📜 方法1:File.ReadAllText(读取整个文本文件)
csharp
string path = @"C:\Example\test.txt";
try
{
string content = File.ReadAllText(path);
Console.WriteLine(content);
}
catch (IOException ex)
{
Console.WriteLine($"读取失败: {ex.Message}");
}
特点 :
✅ 超简单,单行代码读取全部
❌ 仅适合小型文件 (全部加载到内存)
🚀 适用于配置文件、JSON等小文件
📜 方法2:File.ReadAllLines(按行读取为数组)
csharp
string[] lines = File.ReadAllLines(path);
foreach (string line in lines)
{
Console.WriteLine(line);
}
特点 :
✅ 分行处理,适合日志文件
❌ 同样全量加载,内存压力大
📜 方法3:StreamReader(逐行读取,内存友好)
csharp
using (StreamReader reader = new StreamReader(path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line); // 逐行处理
}
}
特点 :
✅ 内存效率高 ,适合大文件
🔥 推荐用于日志文件、大型CSV
📜 方法4:FileStream(二进制/字节读取)
csharp
byte[] buffer = new byte[1024];
using (FileStream fs = new FileStream(path, FileMode.Open))
{
int bytesRead;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
string chunk = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.Write(chunk);
}
}
特点 :
✅ 适合二进制文件 (如图片、视频)
⚡ 可控缓冲区大小
📜 方法5:async/await(异步读取,避免UI卡顿)
csharp
async Task ReadFileAsync(string path)
{
using (StreamReader reader = new StreamReader(path))
{
string content = await reader.ReadToEndAsync();
Console.WriteLine(content);
}
}
// 调用
await ReadFileAsync(@"C:\largefile.txt");
特点 :
✅ 不阻塞UI线程 ,WinForms/WPF必备
🌐 适合网络磁盘文件
📜 方法6:MemoryMappedFile(超大型文件,内存映射)
csharp
using (var mmf = MemoryMappedFile.CreateFromFile(path))
{
using (var stream = mmf.CreateViewStream())
{
byte[] buffer = new byte[1024];
stream.Read(buffer, 0, buffer.Length);
string text = Encoding.UTF8.GetString(buffer);
Console.WriteLine(text);
}
}
特点 :
✅ 处理GB级文件 (如数据库文件)
🔧 高级场景使用
📊 方法对比表
| 方法 | 适用文件大小 | 内存占用 | 速度 | 适用场景 |
|---|---|---|---|---|
ReadAllText |
<10MB | 高 | 快 | 配置文件 |
ReadAllLines |
<10MB | 高 | 快 | 日志分析 |
StreamReader |
任意 | 低 | 中 | 大型文本 |
FileStream |
任意 | 可控 | 中 | 二进制文件 |
async/await |
任意 | 依实现 | 中 | UI程序 |
MemoryMapped |
GB+ | 极低 | 慢 | 超大文件 |
⚠️ 注意事项
- 异常处理 :始终用
try-catch捕获FileNotFoundException或IOException - 路径安全:
csharp
string safePath = Path.Combine("C:", "Folder", "file.txt"); // 避免手写路径
- 编码问题 :指定正确的编码(如中文用
Encoding.UTF8)
csharp
File.ReadAllText(path, Encoding.GetEncoding("GB2312"));
- 资源释放 :必须用
using或手动释放FileStream/StreamReader
🔥 最佳实践
- 小型文本 →
File.ReadAllText - 大型文本 →
StreamReader+while - 二进制数据 →
FileStream - UI程序 → async/await +
ReadToEndAsync - GB级文件 →
MemoryMappedFile