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

文件的操作

文件读取

1、文件操作

  • 文件操作:创建、删除、判断文件是否存在、获取子文件/所有文件
  • 目录操作:创建、删除、判断目录是否存在、获取子目录/所有子目录
  • 读写文件内容

1.1、什么是文件?

内存:临时存储。变量、数组、对象等都是存储在内存中。
硬盘:永久存储。使用文件形式进行存储,这个过程被称为持久化。
内存存储的数据,计算机关机之后会丢失;硬盘存储的数据会被持久化保存,除非人为进行删除。

1.2、什么是目录?

管理和组织文件的虚拟容器,对文件进行分类和保护。目录又称文件夹,是计算机文件系统中的一种数据结构,核心功能包括:

  1. 分类存储:基于文件类型或用途建立层级结构,避免文件混杂。‌‌
  2. 逻辑管理:通过树状目录实现文件唯一标识.
  3. 权限控制:提供加密、隐藏等功能以保护隐私。

2、Path

  • Path类是一个静态类,也称工具类,位于System.IO命名空间,可以用来操作路径的每一个字段。
  • Path类的静态属性和方法,此类操作不影响物理文件,可以跨平台工作。

2.1、常用的Path属性和方法

  1. 组合路径
    Path.Combine()方法 返回值为string 自动处理路径分隔符
    示例:string path = Path.Combine("C:","File","hello.txt");
  2. 获取文件名/最后一个目录的目录名
    Path.GetFileName(path) 返回值为string
    示例:string name = Path.GetFileName(@"C:\file\hello.txt");
  3. 获取扩展名
    Path.GetExtension(path);返回值为string
    示例:string extension = Path.GetExtension("file.txt");
  4. 获取目录名
    Path.GetDirectoryName(path)返回值为string
    示例:string directory = Path.GetDirectoryName("C:/Folder/file.txt");
  5. 获取完整路径 返回值为string
    Path.GetFullPath(path);
    示例:string fullPath = Path.GetFullPath("file.txt");

3、File

File 类是 C# 中用于处理文件操作的静态类,位于 System.IO 命名空间。它提供了创建、复制、删除、移动和打开文件的静态方法,是文件 I/O 操作的核心工具。

3.1、文件基本操作

点击查看代码
`c#`
string path = "C:/Folder/file.txt";
string aimPath = ""C:/Aim/aimfile.txt"";
文件判断
存在返回true 不存在则为false
bool exist = File.Exists(path);
文件创建
FileStream fs = File.Create(path); // 先判断是否存在再进行创建
fs.Close(); // 必须关闭文件流
删除文件
File.Delete(path);
复制文件
File.Copy(path,aimPath); // aimPath存在则抛异常IOException
不想抛异常就进行覆盖操作
File.Copy(path,aimPath,true); // 慎用
移动文件
File.Move(path,aimPath);
重命名文件
File.Move(@"C:\oldname.txt", @"C:\newname.txt"); // 移动至相同路径,文件名不同读取文件
第一种,使用ReadAllBytes()函数,将文件中的内容转换为byte数组并返回
byte[] buffer = File.ReadAllBytes(path); // 读
string s = Encoding.GetEncoding("UTF-8").GetString(buffer); // 进行解码操作
Console.WriteLine(s); //输出文件内容
第二种,使用ReadAllLines()方法,以行的形式读取文本文件,返回string[] 
string[] allLines = File.ReadAllLines(path);foreach (string line in allLines) //获取每行数据{Console.WriteLine(line);}
第三种,使用ReadAllText()方法读取文本文件所有内容,并返回string
string content = File.ReadAllText(path);
Console.WriteLine(content);
总结
- ReadAllBytes(): 读取字节形式文件(多媒体)
- ReadAllLines(): 可以精确操作每一行数据
- ReadAllText(): 只能返回一个整体写文件
第一种,用WriteAllBytes()方法,以二进制方式写入文件
string str = "你好,C#";
//需要将字符串转换成字节数组        
byte[] buffer = Encoding.Default.GetBytes(str);
File.WriteAllBytes(path, buffer);
Console.WriteLine("写入成功!");
第二种,用WiteAllLines()方法,以行方式写入文件
string[] lines = { "第一行", "第二行", "第三行" };
File.WriteAllLines(path, lines);
第三种,用WriteAllText()方法,以字符串方式写入文件
File.WriteAllText(path, "Hello World!");
注意:
以上三种写入方式都会覆盖文件之前的内容
如果不想覆盖前面文件的内容,使用以下方法
1、AppendAllText() 方法, 追加文本
File.AppendAllText(path,"\n这是追加的内容");
2、AppendAllLines() 方法追加多行文本
File.AppendAllLines(path, new[] { "追加行1", "追加行2" });
注意:没有AppendAllBytes()方法!

在开发过程中, 推荐使用相对路径。
开发过程中,在项目目录下创建文件, 如何让VS自动把文件拷贝到bin/debug目录下?
步骤:解决方案管理器->找到文件->右击选择属性->复制到输出目录->始终复制
怎么得到项目的bin/debug目录?有三种方法,最简单的如下:
string basePath = Directory.GetCurrentDirectory();

4、Directory

Directory 是 C# 中用于操作目录(文件夹)的静态类,位于 System.IO 命名空间。它提供了创建、移动、删除目录以及获取目录信息的方法。

4.1、基本目录操作

点击查看代码
string path = "C:\hello";
string aimPath = "C:\world";
判断目录是否存在 存在返回true  否则返回false
bool exists = Directory.Exists(path);
创建目录
Directory.CreateDirectory(path);
创建多级目录(父目录不存在会自动创建)
Directory.CreateDirectory(@"C:\Hello\World\helloworld");
删除空目录 进行删除操作时,先判断是否存在,否则可能抛异常
Directory.Delete(path);
删除非空目录(递归删除)
Directory.Delete(@"C:\Hello", true);
移动目录(也可用于重命名) Directory.Move(path, aimPath);
注意:
Directory类的Move方法要确保路径都在同一个盘符获取当前目录的所有子文件
string[] files = Directory.GetFiles(path);
foreach (string file in files)
{Console.WriteLine($"文件: {file}");
}获取特定扩展名的子文件
*:表示任意多个字符 ?:表示一个任意字符
string[] txtFiles = Directory.GetFiles(path, "*.txt");
foreach (string file in txtFiles)
{Console.WriteLine($"文件: {file}");
}获取所有后代目录的所有文件
string[] allFiles = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
foreach (string file in allFiles)
{Console.WriteLine($"文件: {file}");
}获取子目录
string[] subDirectories = Directory.GetDirectories(path);
foreach (string dir in subDirectories)
{Console.WriteLine($"子目录: {dir}");
}获取所有后代目录的所有目录
string[] subDirectories = Directory.GetDirectories(path,"*",SearchOption.AllDirectories);
foreach (string dir in subDirectories)
{Console.WriteLine($"后代目录: {dir}");
}

5、IO流

I:Input 输入流 O:Output 输出流
Stream(流)是 C# 中处理 I/O 操作的核心抽象概念,它表示字节序列的抽象视图,提供了读取、写入和定位字节序列的能力。
image

5.1、Stream概念

Stream 是抽象基类,位于 System.IO 命名空间,主要派生类包括:

  • FileStream - 文件流 :使用最多的, IO流一端接在文件上
  • MemoryStream - 内存流:IO流一端接在内存上
  • NetworkStream - 网络流:TCP/IP通信中使用
  • BufferedStream - 缓冲流:缓冲区, 嵌套在其他IO流
  • CryptoStream - 加密流:加密功能
  • GZipStream - 压缩流:对内容进行压缩操作,再进行读写
  • FileStream - 字节流:每次读写一个一个字节

IO是一种资源, 使用完成之后,一定关闭

5.2、主要方法和属性

点击查看代码
   Length属性: IO内容大小Position属性: set/get 位置读取数据Read(byte[] b) 把读取内容,存在byte数组中byte[] buffer:存储数据内容的数组  offset:数组位置  count:个数public abstract int Read(byte[] buffer, int offset, int count);写入数据Write(byte[] ) 把byte数组写到文件public abstract void Write(byte[] buffer, int offset, int count);定位public abstract long Seek(long offset, SeekOrigin origin);刷新缓冲区public abstract void Flush();释放资源public void Dispose();

5.3、相关类

FileMode类: 枚举类,FileMode 参数控制文件是覆盖、创建、打开还是某种组合。 用于 open 打开现有文件。 若要追加到文件,请使用 Append。 若要截断文件或创建文件(如果不存在),请使用 Create

image

FileAccess类: 枚举类,定义哪种权限打开文件

image

FileShare类: 枚举类,控制其他FileStream操作对同一文件可以具有的访问类型的常量。
image

5.4、FileStream文件流(字节流)

5.4.1、构造方法

image

重要参数解析
string path: 文件路径参数
FileMode mode: 指定操作系统打开文件的方式
FileAccess access: 定义文件的读取、写入或读/写访问权限的常量
FileShare share: 枚举值的按位组合,确定文件如何由进程共享。

注意: 无法使用FileStream的空参构造!
示例:
FileStream (string path, System.IO.FileMode mode, System.IO.FileAccess access)
语义:使用指定的路径、创建模式和读/写权限初始化 FileStream类的新实例。

5.4.2、文件读写

点击查看代码
string path = "C:\hello.txt";
// 创建/打开文件流
// 使用using语法糖,自动释放资源 前提:使用的类必须实现/间接实现 IDisposable 接口
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{// 写入数据byte[] data = Encoding.UTF8.GetBytes("Hello, FileStream!");fs.Write(data, 0, data.Length);// 定位到开头fs.Seek(0, SeekOrigin.Begin);// 读取数据byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);string content = Encoding.UTF8.GetString(buffer);Console.WriteLine(content);
}
//执行到结束大括号, 自动调用Dispose(), 释放资源

文件复制: 需要两个IO流,两个文件之间不能直接进行读写操作,底层文件的读写都是通过内存进行的。如图:
image

5.5、字符流

为什么使用 StreamReader 字符流? 因为 FileStream: 字节流, 每次读的一个一个字节, 读取中文, 把中文汉字拆成两半,输出乱码。汉字占两个字节。
对于包含中文文本文件, 推荐使用字符流
如果文件是二进制文件(图片,视频,音频) 推荐使用字节流: FileStream

5.5.1、构造方法

  • StreamWriter : 字符输出流 写的方法

image

  • StreamReader : 字符输入流 读的方法

image

5.5.2、字符流的使用

读取文本

点击查看代码
 string path = "C:\Text";读取文本文件using (StreamReader reader = new StreamReader(path, Encoding.UTF8)){Read() 读一个字符, 返回的字符编码 -1: 表示读到文件末尾int content = -1;while ((content= sr.Read()) != -1) {Console.WriteLine((char)content);}ReadLine() 读一行 null: 表示读到文件末尾string line;while ((line = reader.ReadLine()) != null){Console.WriteLine(line);}string ReadToEnd() 把所有内容都读取出来,对于大文件不推荐string allContent = sr.ReadToEnd();Console.WriteLine(allContent);}

写文本

点击查看代码
 string path = "C:\Text";写入文本文件true: 表示追加   默认: false 表示覆盖using (StreamWriter writer = new StreamWriter(path ,true ,Encoding.UTF8)){写一个字符 Write()Write(char)  写一行 WriteLine()writer.WriteLine("第一行");writer.WriteLine("第二行");}

字符流的嵌套使用

点击查看代码
   string path = "C:\Text";using (FileStream fs = new FileStream("log.txt", FileMode.Open))using (StreamReader reader = new StreamReader(fs)){while (!reader.EndOfStream){string line = reader.ReadLine();// 处理行数据}}

5.6、BufferedStream 缓存流

缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用失败次数。缓冲区可提高读取和写入性能。使用缓冲区可进行读取或写入操作,但不能同时进行这两种操作。 BufferedStream类用于读写缓冲区。适合大文件读取。

BufferedStream 是 System.IO 命名空间下的一个装饰器流,它为其他流添加缓冲功能,通过减少实际I/O操作次数来提高性能。

5.6.1、BufferedStream 缓存流工作原理

image
image

  1. 读取时: 从底层流一次性读取大量数据到缓冲区,后续读取直接从缓冲区获取
  2. 写入时: 先将数据写入缓冲区,缓冲区满或Flush时一次性写入底层流

5.6.2、构造方法

image

自带了一个缓冲区: 默认大小: 4096字节 4KB

5.6.3、BufferedStream 缓存流的使用

读取缓冲的文件

点击查看代码
读取带缓冲的文件
string path = "C:\hello.txt";
using (FileStream fs = new FileStream(path, FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
{byte[] buffer = new byte[1024];int bytesRead = bs.Read(buffer, 0, buffer.Length);string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);Console.WriteLine(content);
}

写入缓冲的文件

点击查看代码
写入带缓冲的文件
string path = "C:\hello.txt";
using (FileStream fs = new FileStream(path , FileMode.Create))
using (BufferedStream bs = new BufferedStream(fs, 8192)) // 8KB缓冲区
{byte[] data = Encoding.UTF8.GetBytes("缓冲流示例数据");bs.Write(data, 0, data.Length);bs.Flush(); // 确保数据写入底层流
}

配合StreamReader/Writer流使用

点击查看代码
 string path = "C:\hello.txt";高效文本处理using (FileStream fs = new FileStream(path, FileMode.Open))using (BufferedStream bs = new BufferedStream(fs, 16384))using (StreamReader reader = new StreamReader(bs)){while (!reader.EndOfStream){string line = reader.ReadLine();// 处理行数据}}

最重要的是IO流: FileStream 万能流

http://www.jsqmd.com/news/436905/

相关文章:

  • 博冠8K摄像机的发展历程
  • 当招商遇见投资:在达茂旗,一场关于“共投共建”的实践正在改写发展逻辑 - 资讯焦点
  • 会员管理系统哪个比较好用 - 码云数智
  • JBoss常见的漏洞原理
  • 靠谱的品牌全案营销策划公司推荐:奇正沐古如何盘活项目? - 资讯焦点
  • 详细介绍:从 TLS 到 Kubernetes PKI:一条证书链如何支撑整个集群安全(问题合集)
  • 和小鹅通一样的平台有哪些 - 码云数智
  • GEO 优化专家罗小军:凭全球七大认证与 36 项软著确权 AI 时代获客主权 - 资讯焦点
  • 企业微信ipad协议的设备指纹仿真与反检测策略
  • GEO优化专家推荐:2026年度领军人物榜单发布,罗小军凭硬核实力蝉联榜首 - 资讯焦点
  • Linux软件编程——TCP通信
  • P10218 [省选联考 2024] 魔法手杖 题解
  • 知识付费小程序怎么做,教育培训小程序搭建 - 码云数智
  • 会员管理系统软件哪个好 - 码云数智
  • 查询增强常用的方法有4种
  • 上海品牌全案营销策划公司推荐(2026权威版) - 资讯焦点
  • docx2md-picgo:Word 文档图片一键上传图床工具
  • DMF3938-257,低正向电压型肖特基混频二极管
  • 网站搭建教程,怎样建立一个自己的网站 - 码云数智
  • 盲盒潮玩一番赏小程序开发深度分析
  • DDC2354,零偏压硅肖特基势垒探测器二极管
  • 微信小程序 map组件marker标记如何将重要的放在顶层?
  • Java生态技术栈深度解析:从传统开发到AI驱动的现代化转型
  • 英语词汇的“交通网”:一词多义、隐喻与语义扩展
  • Vue2 web浏览器打印模板
  • 国内靠谱的橡胶木厂家 - 品牌推荐(官方)
  • 微信小程序map地图组件 点击marker事件和点击地图-阻止事件冒泡的解决办法
  • 数据主权与算力围栏:为何你应该为沁言 Claw 多付那 50 元?——一份面向科研从业者的架构评测 - 沁言学术
  • 二次重排序GBDT的学习示例
  • 实用指南:AB实验高级必修课(二):从宏观叙事到微观侦查,透视方差分析与回归的本质