C# 文件 I/O 完全指南:流、读写操作与文件系统管理
文件是存储在磁盘上具有特定名称和目录路径的数据集合。打开文件进行读写时,它成为流。流本质是通过通信路径传递的字节序列。两大主流:输入流(读操作)和输出流(写操作)。
C# I/O 核心类
System.IO 命名空间提供文件操作类:创建/删除文件、读写、关闭等。
| 序号 | 类及说明 |
|---|---|
| 1 | BinaryReader:从二进制流读取基元数据 |
| 2 | BinaryWriter:以二进制格式写入基元数据 |
| 3 | BufferedStream:字节流临时存储 |
| 4 | Directory:操作目录结构(静态方法) |
| 5 | DirectoryInfo:目录操作(实例方法) |
| 6 | DriveInfo:驱动器信息 |
| 7 | File:文件操作(静态方法) |
| 8 | FileInfo:文件操作(实例方法) |
| 9 | FileStream:读写文件任意位置 |
| 10 | MemoryStream:内存中随机访问流数据 |
| 11 | Path:路径信息操作 |
| 12 | StreamReader:从字节流读取字符 |
| 13 | StreamWriter:向流写入字符 |
| 14 | StringReader:从字符串缓冲区读取 |
| 15 | StringWriter:写入字符串缓冲区 |
FileStream 类
FileStream 继承自抽象类 Stream,支持读、写、关闭文件。创建语法:
FileStream <object_name> = new FileStream(
<file_name>,
<FileMode Enumerator>,
<FileAccess Enumerator>,
<FileShare Enumerator>);
示例
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
FileMode 枚举成员
| 成员 | 说明 |
|---|---|
Append | 打开现有文件定位到末尾,或创建新文件 |
Create | 创建新文件(覆盖已存在) |
CreateNew | 指示 OS 创建新文件(已存在则异常) |
Open | 打开现有文件(不存在则异常) |
OpenOrCreate | 存在则打开,不存在则创建 |
Truncate | 打开现有文件并截断为零字节 |
FileAccess 枚举
Read、ReadWrite、Write
FileShare 枚举
| 成员 | 说明 |
|---|---|
Inheritable | 允许文件句柄继承给子进程 |
None | 拒绝共享当前文件 |
Read | 允许打开文件读取 |
ReadWrite | 允许打开文件读写 |
Write | 允许打开文件写入 |
FileStream 完整示例
using System;
using System.IO;
namespace FileIOApplication {
class Program {
static void Main(string[] args) {
FileStream F = new FileStream("test.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite);
for (int i = 1; i <= 20; i++) F.WriteByte((byte)i);
F.Position = 0;
for (int i = 0; i <= 20; i++) Console.Write(F.ReadByte() + " ");
F.Close();
Console.ReadKey();
}
}
}
输出:1 2 3 ... 20 -1(-1 表示流结束)
高级文件操作
| 序号 | 主题及说明 |
|---|---|
| 1 | 文本文件读写:StreamReader / StreamWriter 处理编码文本 |
| 2 | 二进制文件读写:BinaryReader / BinaryWriter 处理基元类型 |
| 3 | Windows 文件系统操作:浏览定位文件和目录 |
文本文件读写示例
// 写入
using (StreamWriter sw = new StreamWriter("test.txt", false, Encoding.UTF8)) {
sw.WriteLine("Hello World");
sw.WriteLine("Line 2");
}
// 读取
using (StreamReader sr = new StreamReader("test.txt", Encoding.UTF8)) {
string line;
while ((line = sr.ReadLine()) != null) Console.WriteLine(line);
}
二进制文件读写示例
// 写入
using (BinaryWriter bw = new BinaryWriter(File.Open("data.bin", FileMode.Create))) {
bw.Write(123);
bw.Write("Hello");
bw.Write(3.14);
}
// 读取
using (BinaryReader br = new BinaryReader(File.Open("data.bin", FileMode.Open))) {
int i = br.ReadInt32();
string s = br.ReadString();
double d = br.ReadDouble();
}
目录与文件操作
// 目录操作
Directory.CreateDirectory(@"C:\Temp\SubDir");
string[] dirs = Directory.GetDirectories(@"C:\Temp");
string[] files = Directory.GetFiles(@"C:\Temp", "*.txt");
Directory.Delete(@"C:\Temp\SubDir", true); // 递归删除
// 文件操作
File.Copy("source.txt", "dest.txt", true); // 覆盖
File.Move("old.txt", "new.txt");
File.Delete("temp.txt");
FileInfo fi = new FileInfo("test.txt");
Console.WriteLine($"Size: {fi.Length}, Created: {fi.CreationTime}");
异步文件操作
.NET 4.5+ 支持异步 I/O,避免阻塞 UI 线程:
// 异步写入
await File.WriteAllTextAsync("async.txt", "Content");
// 异步读取
string content = await File.ReadAllTextAsync("async.txt");
// 流式异步
using (FileStream fs = new FileStream("big.dat", FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) {
byte[] buffer = new byte[8192];
int read = await fs.ReadAsync(buffer, 0, buffer.Length);
}
最佳实践
- 始终用
using语句确保流正确关闭释放 - 大文件用流式处理避免一次性加载进内存
- 指定编码(推荐 UTF-8)避免乱码
- 文件路径用
Path.Combine跨平台兼容 - 异步 I/O 提升响应性,高并发场景必用
C语言