C# 文件 I/O 操作详解:从基础到高级应用

article/2025/6/24 16:08:37

在软件开发中,文件操作(I/O)是一项基本且重要的功能。无论是读取配置文件、存储用户数据,还是处理日志文件,C# 都提供了丰富的 API 来高效地进行文件读写操作。本文将全面介绍 C# 中的文件 I/O 操作,涵盖基础文件操作、文本/二进制文件读写、流式处理、异步 I/O 以及最佳实践,帮助开发者掌握文件处理的技巧。

1. C# 文件操作基础

C# 的文件操作主要依赖于 System.IO 命名空间,其中 FileDirectoryStreamReaderStreamWriter 等类是核心工具。

1.1 检查文件是否存在

在操作文件之前,通常需要检查文件是否存在:

string filePath = @"C:\example\test.txt";
if (File.Exists(filePath))
{Console.WriteLine("文件存在");
}
else
{Console.WriteLine("文件不存在");
}

1.2 创建、删除和移动文件

  • 创建文件

    File.Create(@"C:\example\newfile.txt");
  • 删除文件

    File.Delete(@"C:\example\oldfile.txt");
  • 移动/重命名文件

    File.Move(@"C:\example\oldname.txt", @"C:\example\newname.txt");
  • 复制文件

    File.Copy(@"C:\example\source.txt", @"C:\example\destination.txt");

2. 文本文件的读写

2.1 读取文本文件

C# 提供了多种读取文本文件的方式:

  • File.ReadAllText(读取整个文件)

    string content = File.ReadAllText(filePath);
    Console.WriteLine(content);
  • File.ReadAllLines(逐行读取)

    string[] lines = File.ReadAllLines(filePath);
    foreach (string line in lines)
    {Console.WriteLine(line);
    }
  • StreamReader(流式读取,适合大文件)

    using (StreamReader reader = new StreamReader(filePath))
    {string line;while ((line = reader.ReadLine()) != null){Console.WriteLine(line);}
    }

     

2.2 写入文本文件

  • File.WriteAllText(覆盖写入)

    File.WriteAllText(filePath, "Hello, World!");
  • File.AppendAllText(追加写入)

    File.AppendAllText(filePath, "\nThis is a new line.");
  • StreamWriter(流式写入)

    using (StreamWriter writer = new StreamWriter(filePath))
    {writer.WriteLine("Line 1");writer.WriteLine("Line 2");
    }

3. 二进制文件的读写

二进制文件(如图片、音频、数据库文件)需要使用 BinaryReader 和 BinaryWriter

3.1 写入二进制文件

using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create)))
{writer.Write(100);         // 写入整数writer.Write(3.14);        // 写入双精度浮点数writer.Write("Hello");     // 写入字符串
}

3.2 读取二进制文件

using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
{int number = reader.ReadInt32();double pi = reader.ReadDouble();string text = reader.ReadString();Console.WriteLine($"Number: {number}, Pi: {pi}, Text: {text}");
}

4. 文件流(FileStream)

FileStream 提供了更底层的文件访问方式,适用于大文件或需要精细控制的情况。

4.1 使用 FileStream 读写文件

// 写入文件
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{byte[] data = Encoding.UTF8.GetBytes("Hello, FileStream!");fs.Write(data, 0, data.Length);
}// 读取文件
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{byte[] buffer = new byte[1024];int bytesRead = fs.Read(buffer, 0, buffer.Length);string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine(content);
}

5. 目录操作

除了文件操作,C# 还提供了目录管理功能:

5.1 创建和删除目录

string dirPath = @"C:\example\newfolder";// 创建目录
Directory.CreateDirectory(dirPath);// 删除目录(recursive: true 表示删除非空目录)
Directory.Delete(dirPath, recursive: true);

5.2 遍历目录

// 获取所有文件
string[] files = Directory.GetFiles(dirPath);
foreach (string file in files)
{Console.WriteLine(file);
}// 获取所有子目录
string[] subDirs = Directory.GetDirectories(dirPath);
foreach (string dir in subDirs)
{Console.WriteLine(dir);
}

6. 异步文件操作

异步 I/O 可以提高程序性能,特别是在处理大文件时。

6.1 异步读取文件

async Task<string> ReadFileAsync(string path)
{using (StreamReader reader = new StreamReader(path)){return await reader.ReadToEndAsync();}
}

6.2 异步写入文件

async Task WriteFileAsync(string path, string content)
{using (StreamWriter writer = new StreamWriter(path)){await writer.WriteAsync(content);}
}

7. 文件操作的最佳实践

  1. 使用 using 语句:确保文件流正确关闭,避免资源泄漏。

  2. 异常处理:捕获 IOExceptionFileNotFoundException 等异常。

  3. 大文件处理:使用流式读取(StreamReader/FileStream)而非一次性读取全部内容。

  4. 路径处理:使用 Path.Combine 拼接路径,避免硬编码:

    string fullPath = Path.Combine(@"C:\example", "subfolder", "file.txt");
  5. 文件权限检查:在访问文件前检查权限(File.GetAccessControl)。

8. 总结

本文详细介绍了 C# 中的文件 I/O 操作,包括:

  • 基本文件操作(创建、删除、移动、复制)

  • 文本文件的读写(File.ReadAllTextStreamReader

  • 二进制文件的处理(BinaryReader/BinaryWriter

  • 文件流(FileStream)的使用

  • 目录管理(Directory 类)

  • 异步文件操作(ReadAsync/WriteAsync

  • 最佳实践(异常处理、资源释放、路径管理)

掌握这些技术后,你可以高效地处理各种文件操作需求,无论是小型配置文件还是大型数据文件。希望本文对你有所帮助!

 


http://www.hkcw.cn/article/UfGsCmXyeK.shtml

相关文章

PCB设计教程【强化篇】——USB拓展坞原理图设计

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、新建工程与元件…

开源版 PyMOL 如何绘制 Galidesivir 分子结构 ?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 先从 www.python.org 下载 python-…

Leetcode 2819. 购买巧克力后的最小相对损失

1.题目基本信息 1.1.题目描述 现给定一个整数数组 prices&#xff0c;表示巧克力的价格&#xff1b;以及一个二维整数数组 queries&#xff0c;其中 queries[i] [ki, mi]。 Alice 和 Bob 去买巧克力&#xff0c;Alice 提出了一种付款方式&#xff0c;而 Bob 同意了。 对于…

Torch Geometric环境下无线通信网络拓扑推理节点数据缺失实验

节点数据缺失样本生成&#xff1a; gcn_dataset_incomplete.py #作者&#xff1a;zhouzhichao #创建时间&#xff1a;2025/5/30 #内容&#xff1a;生成残缺数据集用于实验import h5py import numpy as np import torch from torch_geometric.data import InMemoryDataset, Da…

【网络与信息安全】实验三 RSA加解密与签名验证

实验三、RSA加解密与签名验证 一、实验基本信息 实验名称&#xff1a;RSA加解密与签名验证实验目的&#xff1a; 理解 RSA 加密解密 与 数字签名验证 的原理。借助 CyberChef 可视化平台&#xff0c;观察和理解加密与签名背后的数据变化。 二、实验环境 操作系统&#xff1a…

HackMyVM-Ephemeral3

信息搜集 主机发现 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …

131. 分割回文串-两种回溯思路

我们可以将字符串分割成若干回文子串&#xff0c;返回所有可能的方案。如果将问题分解&#xff0c;可以表示为分割长度为n-1的子字符串&#xff0c;这与原问题性质相同&#xff0c;因此可以采用递归方法解决。 为什么回溯与递归存在联系&#xff1f;在解决这个问题时&#xff0…

Another Redis Desktop Manager 1.3.7 安装教程 - 详细步骤图解 (Windows)

在安装前需要下载安装包&#xff1a;https://pan.quark.cn/s/2dd4432cefaa 下载安装包 先找到那个叫 Another-Redis-Desktop-Manager.1.3.7.exe 的文件&#xff0c;双击它运行 安装向导 接着会出来安装界面&#xff0c;直接点“下一步”&#xff08;Next&#xff09;继续。 …

ShenNiusModularity项目源码学习(32:ShenNius.Admin.Mvc项目分析-17)

栏目管理页面用于新建、维护及删除系统CMS管理模块的栏目信息&#xff0c;栏目信息用于分类管理文章&#xff0c;其后台控制器类ColumnController位于ShenNius.Admin.Mvc项目的Areas\Cms\Controllers内&#xff0c;页面文件位于同项目的Areas\Cms\Views\Column内&#xff0c;其…

Python(十四)

1.type函数和init_subclass_ init_subclass_ 2.元类 类就是用来创建对象的模版&#xff0c;类是由type创造而来的&#xff0c;元类就是创建类的模版&#xff0c;type可以用来创造类&#xff0c;因为type本身就是一个元类&#xff0c;使用元类来创造类&#xff0c;元类之间也有…

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件&#xff1a;Generate GUID 3、修改SceneSave.cs脚本 添加1行代码&#xff1a; 4、修改TimeManager.cs脚本 添加&#xff1a; using System; 修改TimeManager类&#xff1a; 添加属…

蓝桥杯java2022年十三届国赛大学A组答案整理

小蓝与钥匙 问题描述 小蓝是幼儿园的老师, 他的班上有 28 个孩子, 今天他和孩子们一起进行了 一个游戏。 小蓝所在的学校是寄宿制学校, 28 个孩子分别有一个自己的房间, 每个房 间对应一把钥匙, 每把钥匙只能打开自己的门。现在小蓝让这 28 个孩子分别将 自己宿舍的钥匙上交…

【Block总结】Dynamic Tanh (DyT)|即插即用|何凯明和Yann LeCun署名

论文信息 Dynamic Tanh (DyT) 是由Meta、NYU、MIT和Princeton的研究团队提出的一种新方法,旨在取代Transformer模型中的归一化层(如LayerNorm和RMSNorm)。论文的核心目标是挑战深度学习中“归一化层不可或缺”的传统认知,提出一种更简单、更高效的替代方案。 DyT 的提出基…

不加载PHP OpenTelemetry SDK实现Trace‌与Logs

目录 前言一、回到OpenTelemetry原理看问题1、数据接收&#xff08;Receivers&#xff09;2、数据处理&#xff08;Processors&#xff09;3、数据导出&#xff08;Exporters&#xff09; 二、不加载OpenTelemetry SDK实现Trace‌与Logs示例 前言 前面两篇我们分别介绍了OpenT…

一文认识并学会c++模板初阶

文章目录 泛型编程&#xff1a;概念 函数模板概念&#xff1a;&#x1f6a9;函数模板格式原理&#xff1a;&#x1f6a9;函数模板实例化与非模板函数共存 类模板类模板实例化 泛型编程&#xff1a; 概念 &#x1f6a9;编写与类型无关的通用代码&#xff0c;是代码复写一种手段…

leetcode刷题日记——二叉树的右视图

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 二叉树的右视图&#xff1a;即二叉树每层最右边的节点BFS&#xff1a;使用层次遍历&#xff0c;每当遍历到每层最后一个节点时&#xff0c;记录改节点的值运行如下 int* rightSideView(struct TreeNode* root, int* returnS…

python 空气质量可视化,数据分析 + 前后端分离 + ppt 演讲大纲

1. 起因&#xff0c; 目的: 前段时间写的一个小项目&#xff0c;整理为一篇文章&#xff0c;发布出去&#xff0c;然后删掉项目。完整项目&#xff0c;见顶部链接。使用过程&#xff0c; 下面有说明。 2. 先看效果 3. 过程: 后端 python fastapi前端 python plotly # 数据…

|从零开始的Pyside2界面编程|绘图、布局及页面切换

&#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 布局及页面切换&#x1f411;♈前言♈♈页面切换♈♈页面布局♈♈总结♈ ♈前言♈ 经过两周的学习自己设备的前端也算是完成了一小半了&#xff…

我的世界Java版1.21.4的Fabric模组开发教程(十一)创建方块

这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第十一章——创建方块。想要阅读其他内容&#xff0c;请查看或订阅上面的专栏。 方块(Block) 是构成Minecraft世界的主要组成部分&#xff0c;是组成游戏地图的最基本单元&#xff0c;也是模组开发的核心元素之一…

计算机网络:物理层

目录 一、物理层的基本概念 二、物理层下面的传输媒体 2.1 导引型传输媒体 2.1.1 同轴电缆 2.1.2 双绞线 2.1.3 光纤 2.1.4 电力线 2.2 非导引型传输媒体 2.2.1 无线电波 2.2.2 微波 2.2.3 红外线 2.2.4 可见光 三、传输方式 3.1 串行与并行 3.2 同步与异步 3.…