C# 文件和 IO
本章将介绍 C# 中的文件操作和流处理。
文件操作
File 类
using System.IO;
// 读取文件
string content = File.ReadAllText("file.txt");
string[] lines = File.ReadAllLines("file.txt");
byte[] data = File.ReadAllBytes("file.bin");
// 写入文件
File.WriteAllText("file.txt", "Hello");
File.WriteAllLines("file.txt", new[] { "Line1", "Line2" });
File.WriteAllBytes("file.bin", new byte[] { 1, 2, 3 });
// 检查存在
bool exists = File.Exists("file.txt");
// 文件信息
FileInfo info = new FileInfo("file.txt");
Console.WriteLine(info.Name);
Console.WriteLine(info.Length);
Console.WriteLine(info.CreationTime);
Directory 类
using System.IO;
// 检查目录存在
bool dirExists = Directory.Exists("mydir");
// 创建目录
Directory.CreateDirectory("mydir/subdir");
// 删除目录
Directory.Delete("mydir", true); // 递归删除
// 列出文件
string[] files = Directory.GetFiles(".");
string[] dirs = Directory.GetDirectories(".");
// 获取当前目录
string current = Directory.GetCurrentDirectory();
Path 类
using System.IO;
// 路径操作
string path = "C:/folder/file.txt";
string name = Path.GetFileName(path); // file.txt
string ext = Path.GetExtension(path); // .txt
string dir = Path.GetDirectoryName(path); // C:/folder
string baseName = Path.GetFileNameWithoutExtension(path); // file
string newPath = Path.ChangeExtension(path, ".md"); // C:/folder/file.md
// 组合路径
string combined = Path.Combine("C:/folder", "sub", "file.txt"); // C:/folder/sub/file.txt
流操作
FileStream
using System.IO;
// 写入文件流
using (FileStream fs = new FileStream("test.txt", FileMode.Create))
{
string text = "Hello, World!";
byte[] bytes = Encoding.UTF8.GetBytes(text);
fs.Write(bytes, 0, bytes.Length);
}
// 读取文件流
using (FileStream fs = new FileStream("test.txt", FileMode.Open))
{
byte[] buffer = new byte[1024];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
}
StreamReader 和 StreamWriter
using System.IO;
// 写入文本
using (StreamWriter writer = new StreamWriter("test.txt"))
{
writer.WriteLine("第一行");
writer.WriteLine("第二行");
writer.Write("不带换行");
}
// 读取文本
using (StreamReader reader = new StreamReader("test.txt"))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
// 一次性读取
string content = File.ReadAllText("test.txt");
二进制读写
using System.IO;
// 写入二进制
using (BinaryWriter writer = new BinaryWriter(new FileStream("data.bin", FileMode.Create)))
{
writer.Write(123); // 整数
writer.Write(3.14); // 双精度
writer.Write("Hello"); // 字符串
writer.Write(true); // 布尔
}
// 读取二进制
using (BinaryReader reader = new BinaryReader(new FileStream("data.bin", FileMode.Open)))
{
int i = reader.ReadInt32();
double d = reader.ReadDouble();
string s = reader.ReadString();
bool b = reader.ReadBoolean();
}
内存流
using System.IO;
// 使用 MemoryStream 在内存中操作数据
using (MemoryStream ms = new MemoryStream())
{
byte[] data = Encoding.UTF8.GetBytes("Hello");
ms.Write(data, 0, data.Length);
// 重置位置
ms.Position = 0;
// 读取
byte[] result = ms.ToArray();
}
文件夹监控
FileSystemWatcher
using System.IO;
FileSystemWatcher watcher = new FileSystemWatcher(".")
{
Filter = "*.txt",
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName
};
watcher.Changed += (s, e) => Console.WriteLine($"文件改变: {e.FullPath}");
watcher.Created += (s, e) => Console.WriteLine($"文件创建: {e.FullPath}");
watcher.Deleted += (s, e) => Console.WriteLine($"文件删除: {e.FullPath}");
watcher.Renamed += (s, e) => Console.WriteLine($"文件重命名: {e.OldFullPath} -> {e.FullPath}");
watcher.EnableRaisingEvents = true;
// 监听一段时间后停止
Console.ReadKey();
小结
- File:文件级别操作(读写整个文件)
- Directory:目录操作(创建、删除、列举)
- FileStream:底层流操作(字节级别)
- StreamReader/Writer:文本流操作
- BinaryReader/Writer:二进制流操作
- FileSystemWatcher:文件系统监控
练习
- 实现文件复制功能
- 实现文本文件的行统计
- 实现文件搜索功能(按扩展名)
- 实现简单的文件监控工具