一、基本概念
1. 数据存储方式对比
存储方式 | 适用场景 | 特点 |
---|---|---|
数据库存储 | 大量、关系复杂、有序的数据 | 结构化强,支持复杂查询和事务 |
文件存储 | 少量、关系简单的数据(如日志) | 操作简便,可存储于任意介质 |
2. 文件与流
-
文件:存储在磁盘中,带有指定名称和路径的数据集合。
-
流(Stream):文件读写时的字节序列,分为:
-
输入流:从文件读取数据(读操作)
-
输出流:向文件写入数据(写操作)
-
二、核心 I/O 类(System.IO 命名空间)
类名 | 描述 |
---|---|
BinaryReader |
从二进制流读取原始数据 |
BinaryWriter |
以二进制格式写入原始数据 |
BufferedStream |
字节流的临时存储(缓冲区),提升读写性能 |
Directory |
静态类,操作目录结构(创建、删除、遍历等) |
DirectoryInfo |
非静态类,对目录执行操作(实例化后使用,更灵活) |
DriveInfo |
提供驱动器信息(如容量、文件系统) |
File |
静态类,操作文件(创建、删除、读写等) |
FileInfo |
非静态类,对文件执行操作(实例化后使用,适合多次操作同一文件) |
FileStream |
用于文件任意位置的读写(字节级操作) |
MemoryStream |
操作内存中的数据流(随机访问) |
Path |
处理路径信息(拼接、解析路径等) |
StreamReader |
从字节流读取字符(文本文件读操作) |
StreamWriter |
向流写入字符(文本文件写操作) |
三、常用类详解
1. FileStream(字节级文件操作)
用于直接操作字节数组,处理文件的读写与关闭,派生自Stream
。
核心用法
-
构造函数 :
new FileStream(路径, FileMode, FileAccess, FileShare)
-
FileMode
:文件操作类型(Open
/Create
/OpenOrCreate
/Append
) -
FileAccess
:数据操作权限(Read
/Write
/ReadWrite
)
-
-
读写示例:
// 读文件 using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[1024]; int length = fs.Read(buffer, 0, buffer.Length); // 读取字节 string content = Encoding.UTF8.GetString(buffer, 0, length); // 解码 } // 写文件 using (FileStream fs = new FileStream("test.txt", FileMode.Create, FileAccess.Write)) { byte[] data = Encoding.UTF8.GetBytes("Hello"); // 编码 fs.Write(data, 0, data.Length); // 写入字节 }
2. BinaryReader / BinaryWriter(二进制文件操作)
专门处理二进制文件的读写,简化原始数据(如数值、字符串)的二进制转换。
示例
// 写二进制文件
using (FileStream fs = new FileStream("data.bin", FileMode.Create))
using (BinaryWriter bw = new BinaryWriter(fs)) {
bw.Write(123); // 写入整数
bw.Write("test"); // 写入字符串
}
// 读二进制文件
using (FileStream fs = new FileStream("data.bin", FileMode.Open))
using (BinaryReader br = new BinaryReader(fs)) {
int num = br.ReadInt32(); // 读整数
string str = br.ReadString(); // 读字符串
}
3. BufferedStream(带缓冲区的流)
通过内存缓冲区减少对操作系统的调用,提升大数据读写性能。
示例
using (FileStream fs = new FileStream("bigfile.txt", FileMode.Create))
using (BufferedStream bs = new BufferedStream(fs)) {
byte[] data = Encoding.UTF8.GetBytes("大量数据...");
bs.Write(data, 0, data.Length); // 先写入缓冲区,满了自动刷到文件
bs.Flush(); // 手动刷新缓冲区(确保数据写入文件)
}
4. File 类(静态文件操作)
静态类,提供创建、删除、移动、复制文件及读写数据的快捷方法(适合单次操作)。
常用方法
方法 | 作用 |
---|---|
Create(string path) |
创建文件,返回FileStream |
Delete(string path) |
删除文件 |
Move(string src, string dest) |
移动文件 |
Copy(string src, string dest) |
复制文件 |
WriteAllText(string path, string content) |
写入字符串(覆盖原内容) |
ReadAllText(string path) |
读取所有内容为字符串 |
WriteAllLines(string path, string[] lines) |
按行写入字符串数组 |
5. StreamReader / StreamWriter(文本文件操作)
专门处理字符流,自动处理编码(默认 UTF-8),适合读写文本文件。
示例
// 写文本文件
using (StreamWriter sw = new StreamWriter("log.txt")) {
sw.WriteLine("第一行");
sw.WriteLine("第二行");
}
// 读文本文件
using (StreamReader sr = new StreamReader("log.txt")) {
string line;
while ((line = sr.ReadLine()) != null) { // 逐行读取
Console.WriteLine(line);
}
}
6. DriveInfo(驱动器信息)
获取计算机中驱动器的详细信息(如容量、文件系统类型)。
常用属性
-
AvailableFreeSpace
:可用空间(字节) -
DriveFormat
:文件系统(如 NTFS) -
DriveType
:驱动器类型(固定 / 移动 / CD-ROM 等) -
IsReady
:驱动器是否就绪
示例
DriveInfo cDrive = new DriveInfo("C:");
if (cDrive.IsReady) {
Console.WriteLine($"可用空间:{cDrive.AvailableFreeSpace / 1024 / 1024} MB");
Console.WriteLine($"文件系统:{cDrive.DriveFormat}");
}
7. 文件属性操作(File / FileInfo)
获取或设置文件属性(如只读、隐藏),File
是静态方法,FileInfo
是实例方法(适合多次操作)。
示例
FileInfo file = new FileInfo("test.txt");
file.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden; // 设置只读+隐藏
Console.WriteLine($"是否只读:{file.IsReadOnly}");
Console.WriteLine($"创建时间:{file.CreationTime}");
8. 路径操作(Path / Environment)
-
Path 类:处理路径字符串(跨平台兼容)。
-
GetDirectoryName(path)
:获取目录 -
GetExtension(path)
:获取扩展名 -
Combine(path1, path2)
:拼接路径 -
GetFullPath(relativePath)
:获取绝对路径
-
-
Environment 类:提供系统环境信息。
-
CurrentDirectory
:当前工作目录 -
GetFolderPath(SpecialFolder)
:获取特殊文件夹路径(如桌面、临时目录)
-
9. 目录操作(Directory / DirectoryInfo)
-
Directory
:静态类,适合单次目录操作。 -
DirectoryInfo
:非静态类,适合多次操作同一目录。
常用方法
-
CreateDirectory(path)
:创建目录(含多级) -
Delete(path, recursive)
:删除目录(recursive=true
删除非空目录) -
GetFiles(path)
:获取目录下所有文件 -
GetDirectories(path)
:获取子目录
递归遍历目录示例
static void TraverseDir(string path) {
foreach (string dir in Directory.GetDirectories(path)) {
Console.WriteLine($"目录:{dir}");
foreach (string file in Directory.GetFiles(dir)) {
Console.WriteLine($"文件:{file}");
}
TraverseDir(dir); // 递归遍历子目录
}
}
四、using 语句的作用
自动释放实现IDisposable
接口的资源(如流、文件句柄),避免手动调用Close()
和Dispose()
。
// 简化前
FileStream fs = new FileStream("test.txt", FileMode.Open);
// ... 操作 ...
fs.Close();
fs.Dispose();
// 简化后(自动释放)
using (FileStream fs = new FileStream("test.txt", FileMode.Open)) {
// ... 操作 ...
}
五、总结
-
核心类 :必须掌握
File
/FileInfo
(文件)、Directory
/DirectoryInfo
(目录)、Path
(路径)、DriveInfo
(驱动器)。 -
静态 vs 非静态:
-
静态类(
File
/Directory
):适合单次操作,无需实例化。 -
非静态类(
FileInfo
/DirectoryInfo
/DriveInfo
):适合多次操作同一对象,更灵活。
-
-
编码一致性:读写文件时需使用相同编码(如 UTF-8),避免乱码。
-
资源释放 :优先使用
using
语句,确保资源正确释放。