在 c# 中读取文件有多种方法,不同方式适用于不同场景(小型文件、大型文件、文本文件或二进制文件)。以下是 6 种主流方法及其适用场景:
方法1:file.readalltext(读取整个文本文件)
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(按行读取为数组)
string[] lines = file.readalllines(path);
foreach (string line in lines)
{
console.writeline(line);
}
特点:
- 分行处理,适合日志文件
- 同样全量加载,内存压力大
方法3:streamreader(逐行读取,内存友好)
using (streamreader reader = new streamreader(path))
{
string line;
while ((line = reader.readline()) != null)
{
console.writeline(line); // 逐行处理
}
}
特点:
- 内存效率高,适合大文件
- 推荐用于日志文件、大型csv
方法4:filestream(二进制/字节读取)
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卡顿)
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(超大型文件,内存映射)
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 - 路径安全:
string safepath = path.combine("c:", "folder", "file.txt"); // 避免手写路径
- 编码问题:指定正确的编码(如中文用
encoding.utf8)
file.readalltext(path, encoding.getencoding("gb2312"));
- 资源释放:必须用
using或手动释放filestream/streamreader
最佳实践
- 小型文本 →
file.readalltext - 大型文本 →
streamreader+while - 二进制数据 →
filestream - ui程序 → async/await +
readtoendasync - gb级文件 →
memorymappedfile
以上就是在c#中读取文件的六种主流方法详解的详细内容,更多关于c#读取文件的资料请关注代码网其它相关文章!
发表评论