第三部分:C#应用开发
第7章:文件与数据处理
7.1 文件读写操作
7.1.1 文件系统基础
C#通过System.IO命名空间提供丰富的文件操作功能,核心类包括:
File:静态方法实现文件创建、复制、删除等操作FileInfo:实例化方式操作文件,提供更多属性(如创建时间、大小等)Directory/DirectoryInfo:目录操作类Path:跨平台路径处理工具类
// 示例:检查文件是否存在
if (File.Exists("test.txt"))
{
Console.WriteLine("文件已存在");
}
7.1.2 文本文件读写
写入文本文件:
// 使用File.WriteAllText(覆盖写入)
File.WriteAllText("demo.txt", "Hello World");
// 使用StreamWriter(追加模式)
using (var writer = new StreamWriter("log.txt", append: true))
{
writer.WriteLine($"{DateTime.Now}: 系统启动");
}
读取文本文件:
// 读取全部内容
string content = File.ReadAllText("config.ini");
// 逐行读取
foreach (string line in File.ReadLines("data.csv"))
{
Console.WriteLine(line);
}
7.1.3 二进制文件操作
使用BinaryReader/BinaryWriter处理非文本数据:
// 写入二进制数据
using (var stream = File.Create("data.bin"))
using (var writer = new BinaryWriter(stream))
{
writer.Write(3.14); // double
writer.Write(42); // int
writer.Write("C#"); // string
}
// 读取二进制数据
using (var stream = File.OpenRead("data.bin"))
using (var reader = new BinaryReader(stream))
{
double pi = reader.ReadDouble();
int num = reader.ReadInt32();
string lang = reader.ReadString();
}
7.1.4 文件流操作(FileStream)
处理大文件时建议使用流式读写:
// 异步文件复制(适合大文件)
async Task CopyFileAsync(string source, string dest)
{
using (FileStream readStream = File.Open(source, FileMode.Open))
using (FileStream writeStream = File.Create(dest))
{
await readStream.CopyToAsync(writeStream);
}
}
7.1.5 特殊文件处理
- CSV文件:建议使用专用库(如CsvHelper)
- 日志文件:考虑使用NLog或Serilog等框架
- 临时文件:使用
Path.GetTempFileName()生成
7.1.6 最佳实践
- 始终使用
using语句确保资源释放 - 处理大文件时采用异步操作(async/await)
- 考虑文件权限问题(
IOException处理) - 跨平台开发时注意路径分隔符(使用
Path.Combine())
7.1.7 常见异常处理
try
{
File.ReadAllText("missing.txt");
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"文件未找到: {ex.FileName}");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("无访问权限");
}
catch (IOException ex) when (ex is DirectoryNotFoundException)
{
Console.WriteLine("目录不存在");
}
7.1.8 现代改进(.NET 6+)
File.ReadLinesAsync():异步逐行读取FileOptions枚举新增Unbuffered选项- 增强的
Span<T>支持提高性能
注意:实际开发中应考虑使用
IWebHostEnvironment(ASP.NET Core)或平台特定API(如Xamarin/Maui)获取正确的文件路径。
