跳到主要内容

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();

小结

  1. File:文件级别操作(读写整个文件)
  2. Directory:目录操作(创建、删除、列举)
  3. FileStream:底层流操作(字节级别)
  4. StreamReader/Writer:文本流操作
  5. BinaryReader/Writer:二进制流操作
  6. FileSystemWatcher:文件系统监控

练习

  1. 实现文件复制功能
  2. 实现文本文件的行统计
  3. 实现文件搜索功能(按扩展名)
  4. 实现简单的文件监控工具