一、基本概念
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
语句,确保资源正确释放。