文件 I/O(输入/输出)是任何应用程序中不可或缺的一部分,无论是读取配置文件、写入日志还是处理用户数据。C# 提供了一套强大且灵活的文件 I/O 功能,使得在 .NET 应用程序中处理文件变得简单而高效。本文将深入探讨 C# 中文件 I/O 的核心概念、API、最佳实践以及一些高级技巧。
文件 I/O 的核心概念
在 C# 中,文件 I/O 操作主要涉及以下几个核心概念:
- 流(Streams):数据的连续序列,可以是字节流或文本流。
- 文件访问模式:如读取、写入、追加等。
- 文件共享:控制文件在多个进程间的访问。
- 缓冲:提高文件操作的性能。
- 异步 I/O:避免阻塞主线程,提高应用程序的响应性。
核心 API
System.IO
命名空间
C# 的文件 I/O 功能主要封装在 System.IO
命名空间中,提供了丰富的类和方法来处理文件和目录。
常用的文件 I/O 类
File
类:提供静态方法来创建、复制、删除、移动和打开文件。FileInfo
类:提供实例方法来操作文件。FileStream
类:表示文件的流,用于读写文件。StreamReader
类:用于从文本文件中读取字符。StreamWriter
类:用于向文本文件写入字符。Directory
类 和DirectoryInfo
类:用于操作目录。Path
类:提供操作文件路径的方法。
基本操作
读取文件
使用 File.ReadAllText
方法
代码语言:javascript复制string content = File.ReadAllText("example.txt");
使用 StreamReader
代码语言:javascript复制using (StreamReader reader = new StreamReader("example.txt"))
{
string content = reader.ReadToEnd();
}
写入文件
使用 File.WriteAllText
方法
代码语言:javascript复制File.WriteAllText("example.txt", "Hello, World!");
使用 StreamWriter
代码语言:javascript复制using (StreamWriter writer = new StreamWriter("example.txt"))
{
writer.WriteLine("Hello, World!");
}
追加文件
代码语言:javascript复制using (StreamWriter writer = new StreamWriter("example.txt", append: true))
{
writer.WriteLine("Appended text.");
}
复制、移动和删除文件
代码语言:javascript复制// 复制文件
File.Copy("source.txt", "destination.txt");
// 移动文件
File.Move("source.txt", "newLocation.txt");
// 删除文件
File.Delete("example.txt");
高级操作
异步文件 I/O
使用 ReadAllTextAsync
和 WriteAllTextAsync
代码语言:javascript复制await File.WriteAllTextAsync("example.txt", "Hello, World!");
使用 FileStream
进行异步读写
代码语言:javascript复制using (FileStream stream = new FileStream("example.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 4096, useAsync: true))
{
byte[] data = new byte[stream.Length];
await stream.ReadAsync(data, 0, data.Length);
// 处理数据...
}
处理大文件
对于大文件,使用流式处理可以避免内存溢出。
代码语言:javascript复制using (StreamReader reader = new StreamReader("largefile.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// 处理每一行
}
}
文件访问模式和共享
代码语言:javascript复制using (FileStream stream = new FileStream("example.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
{
// 读取文件
}
缓冲和性能
使用缓冲可以显著提高文件操作的性能。
代码语言:javascript复制using (BufferedStream buffer = new BufferedStream(stream))
{
// 读写操作
}
监控文件系统
使用 FileSystemWatcher
来监控文件和目录的变化。
using (FileSystemWatcher watcher = new FileSystemWatcher())
{
watcher.Path = "C:\examplePath";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.txt";
watcher.Changed = OnChanged;
watcher.EnableRaisingEvents = true;
}
static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
错误处理
在进行文件 I/O 操作时,应该考虑到可能发生的异常,如 IOException
、UnauthorizedAccessException
等。
try
{
// 文件操作...
}
catch (IOException ex)
{
// 处理 I/O 异常
}
catch (UnauthorizedAccessException ex)
{
// 处理访问权限异常
}