当前位置: 首页 > article >正文

‌C# I/O 核心用法

在 C# 中,输入输出(I/O)操作是处理文件、目录、流等数据交互的核心功能。本文将从基础到高级,系统讲解 C# 中文件 I/O 的实现方式、最佳实践及常见场景解决方案。

一、核心类与命名空间‌

1‌、System.IO 命名空间‌,包含以下关键类:

  • File:静态方法实现文件的创建、读写、删除等。
  • Directory:操作目录(创建、遍历、删除)。
  • Path:安全处理文件路径(跨平台兼容)。
  • FileStream:提供字节级别的文件读写。
  • StreamReader/StreamWriter:封装流,支持文本编码处理。
  • FileInfo/DirectoryInfo:实例方法操作文件或目录属性。

2、其他相关命名空间‌

  • System.IO.Compression:处理 ZIP 压缩文件(如 ZipFile 类)。
  • System.Text.Encoding:定义文本编码(如 UTF-8、GB2312)。

‌二、文件读写操作‌

‌1. 文本文件读写‌

  • ‌快速读写(适合小文件)‌
    使用 File 类的静态方法:
// 读取全部内容
string content = File.ReadAllText("file.txt", Encoding.UTF8);

// 写入内容(覆盖)
File.WriteAllText("file.txt", "Hello World");

// 追加内容
File.AppendAllText("file.txt", "\nNew Line");
  • 流式读写(适合大文件或逐行处理)‌
    使用 StreamReader 和 StreamWriter:
// 逐行读取大文件
using (var reader = new StreamReader("largefile.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

// 流式写入
using (var writer = new StreamWriter("output.txt", append: true))
{
    writer.WriteLine("Line 1");
    writer.WriteLine("Line 2");
}

‌2. 二进制文件读写‌
使用 FileStream 直接操作字节:

// 写入二进制数据
byte[] data = new byte[] { 0x01, 0x02, 0x03 };
using (var stream = new FileStream("data.bin", FileMode.Create))
{
    stream.Write(data, 0, data.Length);
}

// 读取二进制数据
byte[] buffer = new byte[1024];
using (var stream = new FileStream("data.bin", FileMode.Open))
{
    int bytesRead = stream.Read(buffer, 0, buffer.Length);
}

‌三、流(Stream)的核心概念‌

‌1. 流的分类‌

  • ‌FileStream‌:处理文件流。
  • ‌MemoryStream‌:在内存中操作数据。
  • ‌NetworkStream‌:网络数据传输(如 TCP/IP)。

‌2. 流的通用操作‌

using (FileStream fs = new FileStream("file.txt", FileMode.Open, FileAccess.Read))
{
    // 设置流位置(支持随机访问)
    fs.Seek(10, SeekOrigin.Begin);

    // 读取字节
    byte[] buffer = new byte[1024];
    int bytesRead = fs.Read(buffer, 0, buffer.Length);
}

‌3. 缓冲区的优化‌

  • 通过指定缓冲区大小提升性能:
using (var fs = new FileStream("file.txt", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096))
{
    // 更高效的读写操作
}

‌四、异步 I/O 操作‌

  • 使用 async/await 避免阻塞主线程:
// 异步读取文件
public async Task<string> ReadFileAsync(string path)
{
    using (var reader = new StreamReader(path))
    {
        return await reader.ReadToEndAsync();
    }
}

// 异步写入文件
public async Task WriteFileAsync(string path, string content)
{
    using (var writer = new StreamWriter(path))
    {
        await writer.WriteAsync(content);
    }
}

‌五、目录与路径操作‌

‌1. 目录管理‌

// 创建目录(自动忽略已存在)
Directory.CreateDirectory(@"C:\data\logs");

// 遍历所有文件
foreach (string file in Directory.EnumerateFiles(@"C:\data", "*.txt", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

// 删除目录(递归删除)
Directory.Delete(@"C:\data\logs", recursive: true);

‌2. 安全路径处理‌

// 合并路径(自动处理平台分隔符)
string path = Path.Combine("folder", "sub", "file.txt"); // 输出:folder/sub/file.txt

// 获取文件名或扩展名
string fileName = Path.GetFileName(path);    // file.txt
string ext = Path.GetExtension(path);        // .txt

‌六、异常处理与调试‌

‌1. 常见异常类型‌

异常类型触发场景
FileNotFoundException文件不存在
DirectoryNotFoundException目录不存在
UnauthorizedAccessException无权限访问文件或目录
IOException文件被占用、磁盘已满或路径过长

‌2. 健壮的异常处理‌

try
{
    string content = File.ReadAllText("config.json");
}
catch (FileNotFoundException ex)
{
    Console.WriteLine($"文件未找到: {ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"IO错误: {ex.Message}");
}
finally
{
    // 清理资源(如关闭数据库连接)
}

‌七、性能优化与最佳实践‌

‌1. 大文件处理‌

  • 使用流式读写‌:避免一次性加载大文件到内存。
  • ‌设置缓冲区大小‌:通过 FileStream 的 bufferSize 参数优化读写速度。

‌2. 安全性‌

  • ‌验证用户输入路径‌:防止路径遍历攻击(如 …/…/…/)。
string userInput = "userfile.txt";
string safePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, userInput);
  • ‌限制文件访问权限‌:使用 File.GetAccessControl 管理 ACL。

‌3. 资源释放‌

  • ‌始终使用 using 语句‌:确保流、读写器等资源被及时释放。
using (var stream = new FileStream("file.txt", FileMode.Open))
{
    // 操作流
} // 自动调用 stream.Dispose()

‌八、高级主题‌

‌1. 内存映射文件(Memory-Mapped Files)‌
高效处理超大文件或进程间共享数据:

using (var mmf = MemoryMappedFile.CreateFromFile("hugefile.bin"))
{
    using (var accessor = mmf.CreateViewAccessor())
    {
        // 直接操作内存映射区域
        accessor.Write(0, 123); // 写入整数
        int value = accessor.ReadInt32(0);
    }
}

‌2. 文件监控(FileSystemWatcher)‌
实时监控文件或目录变化:

var watcher = new FileSystemWatcher(@"C:\data");
watcher.Filter = "*.txt";
watcher.EnableRaisingEvents = true;

watcher.Changed += (sender, e) => 
{
    Console.WriteLine($"文件 {e.Name} 被修改!");
};

‌3. 文件压缩与解压‌
使用 System.IO.Compression 处理 ZIP 文件:

// 创建 ZIP 文件
ZipFile.CreateFromDirectory(@"C:\data", @"C:\archive.zip");

// 解压 ZIP 文件
ZipFile.ExtractToDirectory(@"C:\archive.zip", @"C:\extracted");

‌九、完整示例:文件加密与解密‌

using System.Security.Cryptography;
using System.Text;

public class FileEncryptor
{
    public static void EncryptFile(string inputFile, string outputFile, string password)
    {
        using (var aes = Aes.Create())
        {
            byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));
            byte[] iv = aes.IV;

            // 写入 IV 到输出文件
            using (var outputStream = new FileStream(outputFile, FileMode.Create))
            {
                outputStream.Write(iv, 0, iv.Length);

                // 加密数据
                using (var cryptoStream = new CryptoStream(outputStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write))
                using (var inputStream = File.OpenRead(inputFile))
                {
                    inputStream.CopyTo(cryptoStream);
                }
            }
        }
    }

    public static void DecryptFile(string inputFile, string outputFile, string password)
    {
        using (var aes = Aes.Create())
        {
            byte[] key = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(password));

            // 读取 IV
            using (var inputStream = new FileStream(inputFile, FileMode.Open))
            {
                byte[] iv = new byte[aes.IV.Length];
                inputStream.Read(iv, 0, iv.Length);

                // 解密数据
                using (var cryptoStream = new CryptoStream(inputStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read))
                using (var outputStream = new FileStream(outputFile, FileMode.Create))
                {
                    cryptoStream.CopyTo(outputStream);
                }
            }
        }
    }
}

十、总结‌

1‌、核心原则‌

  • 资源管理‌:使用 using 或 try/finally 确保资源释放。
  • ‌异常处理‌:捕获特定异常,避免程序崩溃。
  • ‌性能优化‌:流式处理大文件,异步避免阻塞。

2‌、适用场景‌

  • ‌简单操作‌:优先使用 File 的静态方法。
  • ‌复杂控制‌:使用 FileStream 或 MemoryMappedFile。
  • ‌跨平台‌:通过 Path.Combine 处理路径分隔符。

掌握这些内容后,可以高效处理各类文件 I/O 需求,并规避常见陷阱。


http://www.kler.cn/a/593618.html

相关文章:

  • 【工程实践/大批量文件处理】文件排序
  • 笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化
  • 数据类设计_图片类设计之7_矩阵图形类设计更新_实战之页面简单设计(前端架构)
  • VLLM专题(十九)—兼容 OpenAI 的服务器
  • Matplotlib 柱形图
  • 波场trx质押能量租赁平台开发
  • 通信网络安全防护风险评估报告怎么写?范文模版分享
  • 剑指 Offer II 113. 课程顺序
  • NPN三极管基极接稳压管的作用
  • 识别并脱敏上传到deepseek/chatgpt的文本文件中的护照信息
  • companion object和object 从kotlin转java分析
  • Python+selenium,轻松搭建Web自动化测试框架
  • 稳定运行的以PostgreSQL数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 【MyDB】7-客户端服务端通信之1-服务端客户端通信实现前言
  • deque
  • sql批量修改字段某一指定部分+修改重复编号
  • java TCP UDP 客户端访问例子和对比差异
  • 九、JavaScript作用域、预解析
  • 2025年高校辅导员考试题库及答案
  • numpy学习笔记9:numpy的广播机制详细解释