在软件开发中,文件操作(I/O)是一项基本且重要的功能。无论是读取配置文件、存储用户数据,还是处理日志文件,C# 都提供了丰富的 API 来高效地进行文件读写操作。本文将全面介绍 C# 中的文件 I/O 操作,涵盖基础文件操作、文本/二进制文件读写、流式处理、异步 I/O 以及最佳实践,帮助开发者掌握文件处理的技巧。
1. C# 文件操作基础
C# 的文件操作主要依赖于 System.IO
命名空间,其中 File
、Directory
、StreamReader
、StreamWriter
等类是核心工具。
1.1 检查文件是否存在
在操作文件之前,通常需要检查文件是否存在:
string filePath = @"C:\example\test.txt";
if (File.Exists(filePath))
{
Console.WriteLine("文件存在");
}
else
{
Console.WriteLine("文件不存在");
}
1.2 创建、删除和移动文件
-
创建文件:
File.Create(@"C:\example\newfile.txt");
-
删除文件:
File.Delete(@"C:\example\oldfile.txt");
-
移动/重命名文件:
File.Move(@"C:\example\oldname.txt", @"C:\example\newname.txt");
-
复制文件:
File.Copy(@"C:\example\source.txt", @"C:\example\destination.txt");
2. 文本文件的读写
2.1 读取文本文件
C# 提供了多种读取文本文件的方式:
-
File.ReadAllText
(读取整个文件):string content = File.ReadAllText(filePath); Console.WriteLine(content);
-
File.ReadAllLines
(逐行读取):string[] lines = File.ReadAllLines(filePath); foreach (string line in lines) { Console.WriteLine(line); }
-
StreamReader
(流式读取,适合大文件):using (StreamReader reader = new StreamReader(filePath)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } }
2.2 写入文本文件
-
File.WriteAllText
(覆盖写入):File.WriteAllText(filePath, "Hello, World!");
-
File.AppendAllText
(追加写入):File.AppendAllText(filePath, "\nThis is a new line.");
-
StreamWriter
(流式写入):using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Line 1"); writer.WriteLine("Line 2"); }
3. 二进制文件的读写
二进制文件(如图片、音频、数据库文件)需要使用 BinaryReader
和 BinaryWriter
。
3.1 写入二进制文件
using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
{
writer.Write(100); // 写入整数
writer.Write(3.14); // 写入双精度浮点数
writer.Write("Hello"); // 写入字符串
}
3.2 读取二进制文件
using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
{
int number = reader.ReadInt32();
double pi = reader.ReadDouble();
string text = reader.ReadString();
Console.WriteLine($"Number: {number}, Pi: {pi}, Text: {text}");
}
4. 文件流(FileStream)
FileStream
提供了更底层的文件访问方式,适用于大文件或需要精细控制的情况。
4.1 使用 FileStream 读写文件
// 写入文件
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
byte[] data = Encoding.UTF8.GetBytes("Hello, FileStream!");
fs.Write(data, 0, data.Length);
}
// 读取文件
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
byte[] buffer = new byte[1024];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine(content);
}
5. 目录操作
除了文件操作,C# 还提供了目录管理功能:
5.1 创建和删除目录
string dirPath = @"C:\example\newfolder";
// 创建目录
Directory.CreateDirectory(dirPath);
// 删除目录(recursive: true 表示删除非空目录)
Directory.Delete(dirPath, recursive: true);
5.2 遍历目录
// 获取所有文件
string[] files = Directory.GetFiles(dirPath);
foreach (string file in files)
{
Console.WriteLine(file);
}
// 获取所有子目录
string[] subDirs = Directory.GetDirectories(dirPath);
foreach (string dir in subDirs)
{
Console.WriteLine(dir);
}
6. 异步文件操作
异步 I/O 可以提高程序性能,特别是在处理大文件时。
6.1 异步读取文件
async Task<string> ReadFileAsync(string path)
{
using (StreamReader reader = new StreamReader(path))
{
return await reader.ReadToEndAsync();
}
}
6.2 异步写入文件
async Task WriteFileAsync(string path, string content)
{
using (StreamWriter writer = new StreamWriter(path))
{
await writer.WriteAsync(content);
}
}
7. 文件操作的最佳实践
-
使用
using
语句:确保文件流正确关闭,避免资源泄漏。 -
异常处理:捕获
IOException
、FileNotFoundException
等异常。 -
大文件处理:使用流式读取(
StreamReader
/FileStream
)而非一次性读取全部内容。 -
路径处理:使用
Path.Combine
拼接路径,避免硬编码:string fullPath = Path.Combine(@"C:\example", "subfolder", "file.txt");
-
文件权限检查:在访问文件前检查权限(
File.GetAccessControl
)。
8. 总结
本文详细介绍了 C# 中的文件 I/O 操作,包括:
-
基本文件操作(创建、删除、移动、复制)
-
文本文件的读写(
File.ReadAllText
、StreamReader
) -
二进制文件的处理(
BinaryReader
/BinaryWriter
) -
文件流(
FileStream
)的使用 -
目录管理(
Directory
类) -
异步文件操作(
ReadAsync
/WriteAsync
) -
最佳实践(异常处理、资源释放、路径管理)
掌握这些技术后,你可以高效地处理各种文件操作需求,无论是小型配置文件还是大型数据文件。希望本文对你有所帮助!