C# 目录与文件操作笔记

一、基本概念

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)) {  
    // ... 操作 ...  
}  

五、总结

  1. 核心类 :必须掌握File/FileInfo(文件)、Directory/DirectoryInfo(目录)、Path(路径)、DriveInfo(驱动器)。

  2. 静态 vs 非静态:

    • 静态类(File/Directory):适合单次操作,无需实例化。

    • 非静态类(FileInfo/DirectoryInfo/DriveInfo):适合多次操作同一对象,更灵活。

  3. 编码一致性:读写文件时需使用相同编码(如 UTF-8),避免乱码。

  4. 资源释放 :优先使用using语句,确保资源正确释放。