一、基本概念

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语句,确保资源正确释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96044.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96044.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96044.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署flask并迁移至内网

需要直接使用的可以使用下面的链接: 通过网盘分享的文件:docker_flask.tar 链接: https://pan.baidu.com/s/163ocPFw8cqfXgVXeejv36g?pwdqxqm 提取码: qxqm 来自百度网盘超级会员v6的分享 外网部署docker版flask 目录结构 ./miniconda-docker/ ├── d…

161. Java Lambda 表达式 - 使用工厂方法创建 Predicates

文章目录161. Java Lambda 表达式 - 使用工厂方法创建 Predicates🎯 Predicate 工厂方法概览🧪 示例一:Predicate.isEqual() 工厂方法🧪 示例二:Predicate.not() 工厂方法(Java 11)&#x1f3af…

c#Blazor WebAssembly在网页中多线程计算1000万次求余

在 Blazor WebAssembly 中实现多线程计算并获取线程 ID 是可行的,但需要正确配置多线程环境并处理线程安全和 UI 更新逻辑。以下是完整示例和检测方法:一、准备工作:启用多线程支持首先需确保项目已启用 WebAssembly 多线程,修改项…

鼠标右键没有“通过VSCode打开文件夹”

1, WinR 打开运行,输入regedit,打开注册表,找到HKEY_CLASSES_ROOT\*\shell分支,如果没有shell分支,则在*下点击右键,选择“新建-项”,建立shell分支。 2, 在shell下新建“VisualCod…

[ Spring 框架 ] 框架搭建和属性赋值

目录 1. Spring定义: (1). IOC( Inversion of Control): (2). AOP (Aspect Oriented Programming): (3)一站式: 2. spring搭建: (1). 创建一个Maven项目 (2). 导入核心 jar包 (3). 编写 spring 配置文件 (4). 编写实体类,并生成set方法 (5). 在resource中加入spring核…

前端 大文件分片下载上传

前端 大文件分片下载上传 背景介绍: 当前项目是给投行部门做系统,业务方需要有专门的文档中心去管理文件,包括但是不限于文件的上传和下载等等。笔者本来就是采用的浏览器表单上传的方式进行文件上传,但是谁曾想在进行稍微大一点的…

【Python练习】097. 编写一个函数,实现简单的版本控制工具

097. 编写一个函数,实现简单的版本控制工具 097. 编写一个函数,实现简单的版本控制工具 示例代码 功能说明 使用方法 注意事项 实现方法 基于文件快照的实现方法 基于差异存储的实现方法 基于命令模式的实现方法 基于Git-like的实现方法 097. 编写一个函数,实现简单的版本控…

嵌入式硬件篇---Tof

TOF 的原理与本质TOF(Time of Flight,飞行时间)是一种通过测量信号(通常是光)在空间中传播时间来计算距离的技术。其本质是利用 “距离 速度 时间” 的物理公式:通过发射信号(如激光、红外光&…

Vue diff简介

Vue3 diff 最长递增子序列双端diff 理念 相同的前置和后置元素的预处理,考虑边界情况,减少移动;最长递增子序列(动态规划、二分法),判断是否需要移动 操作 前置与后置预处理判断是否需要移动 递增法&#x…

罗技MX Anywhere 2S鼠标修复记录

【现象】单击时总是出现双击的现象 【问题原因】从网络收集: 说法1,欧姆龙微动损坏;说法2,按键磨损导致按键和微动开关接触不良; 【问题排查】 微动损坏:拆掉壳子后,用手按住左键的微动开关&…

常见IP模块的仲裁策略和实现

在一个 Message Unit 中包含两个 Core(处理器核心),它们之间访问共享资源(如寄存器、FIFO、buffer 等)时,仲裁机制(Arbitration) 是确保系统稳定性和正确性的关键。以下是常见的仲裁…

上周60+TRO案件,波比的游戏时间/丹迪世界/飞盘/迪奥/多轮维权,手表/汽车品牌持续发力,垃圾桶专利等新增侵权风险!

赛贝整理上周(2025年8月11日-8月15日)的TRO诉讼案件发案情况,根据赛贝TRO案件查询系统了解到,上周合计发起了超60起诉讼案件,涵盖 IP /品牌、版权、专利等多个领域,涉及影视、奢侈品、汽车、游戏、日常用品…

用 Python 在 30 分钟内搭一个「可回放的实时日志」——把攻击流量变成可视化剧情

业务背景 我们运营一款 FPS 端游,外挂作者常把 DDoS 伪装成「玩家掉线」来骗客服。以前排查要捞 CDN 日志、对时间戳、人工比对,平均 2 小时才能定位。现在用一条 30 行的 Python 脚本把边缘节点日志实时打到 Kafka,再回放到 Grafana&#xf…

如何将 LM Studio 与 ONLYOFFICE 结合使用,实现安全的本地 AI 文档编辑

人工智能正在改变我们的工作方式——但如今大多数 AI 工具都存在弊端:速度和便利性虽有所提升,但也意味着数据需要发送到外部服务器。对于教育工作者、企业、非政府组织以及任何处理敏感信息的人来说,这都是不可接受的风险。 LM Studio 和 O…

超市电商销售分析项目:从数据分析到业务决策

国际超市电商销售数据分析实战:从数据清洗到业务决策的完整流程 在电商行业,数据是驱动业务增长的核心引擎。本文将以国际超市电商销售数据为研究对象,完整拆解从数据准备 → 深度分析 → 策略输出的实战流程,涵盖数据清洗、多维度…

GitHub 热榜项目 - 日榜(2025-08-17)

GitHub 热榜项目 - 日榜(2025-08-17) 生成于:2025-08-17 统计摘要 共发现热门项目:12 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术趋势:1) AI基础设施持续爆发,Archon OS和Parlant聚焦AI任务管…

记忆翻牌游戏 greenfoot 开发

记忆翻牌游戏是一种经典的益智游戏,玩家需要翻开卡片并记住它们的位置,然后找到所有匹配的卡片对。 核心玩法 游戏开始时,所有卡片都是背面朝上玩家每次可以翻开两张卡片如果两张卡片图案相同,则保持翻开状态(匹配成功…

【lucene】SegmentInfos

SegmentInfos 类中文说明 ———————————— **一句话** SegmentInfos 是 segments_N 文件的**内存表示**。它把磁盘上的 segments_N 读进来,变成一堆 SegmentInfo 的集合;当你增删改索引、合并段、提交时,再把它写回磁盘&#x…

Read Frog:一款开源AI浏览器语言学习扩展

Read Frog:一款开源AI浏览器语言学习扩展 来源:Poixe AI Read Frog(中文名:陪读蛙)是一款开源的浏览器扩展,旨在通过人工智能技术,将常规网页浏览转化为一种沉浸式的语言学习体验。该工具通过…

天地图应用篇:增加全屏、图层选择功能

天地图应用篇&#xff1a;增加全屏、图层选择功能本节说明&#xff1a; 目的&#xff1a; 实现地图的图层切换全屏显示 / 退出全屏案例截图 示下&#xff1a;案例代码示例代码&#xff1a; <template><div class"tianditu-map-container"><!-- 顶部搜…