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

第二节阶段WinFrom-5:文件操作

1_文件操作

1.1_数据存储与文件操作

(1)数据的存取方式

  • 数据库存取 -> 适合大量、且关系复杂并有序的数据存取。

  • 文件存取 -> 适合少量、数据关系简单的数据存取,如系统的日志文件等。

(2)文件存取的好处

  • 读取操作方便。

  • 文件可以存储在任何介质中。

(3)文件存取的方式

1.2_文件的输入与输出

(1)一个文件是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个流(Stream)

从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流输出流输入流用于从文件读取数据(读操作),输出流用于向文件写入数据(写操作)

(2)I/O :System.IO 命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等

I/O 类描述
BinaryReader从二进制流读取原始数据。
BinaryWriter以二进制格式写入原始数据。
BufferedStream字节流的临时存储。
Directory有助于操作目录结构。
DirectoryInfo用于对目录执行操作。
DriveInfo提供驱动器的信息。
File有助于处理文件。
FileInfo用于对文件执行操作。
FileStream用于文件中任何位置的读写。
MemoryStream用于随机访问存储在内存中的数据流。
Path对路径信息执行操作。
StreamReader用于从字节流中读取字符。
StreamWriter用于向一个流中写入字符。
StringReader用于读取字符串缓冲区。
StringWriter用于写入字符串缓冲区。

2_FIleStream类

(1)System.IO 命名空间中的 FileStream 类用于文件的读写与关闭。该类派生自抽象类 Stream。

(2)需要创建一个 FileStream 对象来创建一个新的文件,或打开一个已有的文件

//FileStream <object_name> = new FileStream( <file_name>,<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);`
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);

(3)参数:

  • 参数1:文件路径

  • 参数2:FileMode 枚举表示对这个文件的操作。FileMode 枚举的成员有:

    • Open:打开一个已有的文件。如果文件不存在,则抛出异常。

    • Create:创建

    • OpenOrCreate:指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开。

  • 参数3:FileAccess:枚举 表示对这个文件里面的数据进行的操作 ,FileAccess枚举的成员有:

    • Read:对文件的读访问。可从文件中读取数据。同 Write组合即构成读写访问权

    • Write:文件的写访问。可将数据写入文件。同 Read组合即构成读/写访问权

    • ReadWrite :读写

(4)路径:

  • 相对路径:相对于当前文件路径 不完整的路径 \aaa\bbb\1.txt

  • 绝对路径:完整路径 从盘符开始 F:\aaa\1.txt

  • 特殊符号

    • ./表示当前目录 ./1.txt 当前目录下的1.txt文件;./ 可以省略 ./123.txt ==>123.txt 都是表示当前目录下

    • ../ 表示上一级目录

    • ../../表示上上级目录

(5)方法

  • Read():读取数据

    • 参数1:存放数据的字节数组

    • 参数2:开始向字节数组存放的位置

    • 参数3:每次读取的字节的大小

    • 返回值:本次读取到的有效的字节数,比如读取一个3.5m的数据,虽然空间给的是5m,但是实际上只返回了3.5m

  • Write():写入数据

    • 参数1:存放数据的字节数组

    • 参数2:开始读取字节数组的位置

    • 参数3:每次读取的字节的大小

(6)注意:记得关闭数据流fileStream.Close(),并释放占用资源fileStream.Dispose()

//读取文件
//1.创建一个FileStream 对象
FileStream fileStream = new FileStream(@"../../File\123.txt",FileMode.Open,FileAccess.Read);
//2.创建一个字节数组,用于存放读取到的数据
//每次读取5m的数据存储到内存中,然后保存到字节数组中
byte[] buffer = new byte[1024*1024*5];
//3.调用读取的方法
int length=  fileStream.Read(buffer, 0, buffer.Length);
//4.将字节数组中的每一个元素,按照指定的编码格式解码
string info =  Encoding.UTF8.GetString(buffer, 0, length);
//5.关闭文件流
fileStream.Close();
//6.释放占用的资源
fileStream.Dispose();
​
//写入文件
//1.创建文件流
FileStream fileStream = new FileStream(@"../../File\123.txt", FileMode.Open, FileAccess.Write);
//2.将字符串转换为字节数组
string info = "System.IO 命名空间中的 FileStream 类用于文件的读写与关闭。该类派生自抽象类 Stream。";
byte [] buffer= Encoding.UTF8.GetBytes(info);
fileStream.Write(buffer, 0, buffer.Length);
fileStream.Close();
fileStream.Dispose();

3_BinaryWriter 和 BinaryReader

(1)二进制文件的读写。BinaryReader 和 BinaryWriter 类有助于完成二进制文件的读写。

(2)BinaryWriter 二进制写入数据

  • Write()方法:参数为写入的内容

  • Read():方法,读取

(3)BinaryReader 二进制读取数据

  • ReadString() :读取数据

(4)先关闭写入,再关闭文件流

//BinaryWriter 写入
//1.创建文件流
FileStream fileStream = new FileStream("123.txt",FileMode.Create,FileAccess.Write);
//创建二进制的写入实例
BinaryWriter bw = new BinaryWriter(fileStream);
//向缓冲区写入内容
bw.Write("从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:**输入流** 和 **输出流**。**输入流**用于从文件读取数据(读操作),**输出流**用于向文件写入数据(写操作)");
bw.Close();
fileStream.Close();
​
//BinaryReader 二进制读取数据
FileStream fileStream = new FileStream("123.txt", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fileStream);
string info= br.ReadString();
Console.WriteLine(info);

4_BufferedStream 类

(1)缓冲区:是内存中的字节快,用于存储数据,从而减少对操作系统调用的次数,缓冲区可以提高读取和写入的性能

(2)BufferedStream:参数是已经创建的现有的流对象

  • write():方法,写入

    • 参数1:存放数据的字节数组

    • 参数2:开始读取字节数组的位置

    • 参数3:每次读取的字节的大小

  • Read()

(3)先清楚缓冲区bs.Flush();,再关闭bs.Close();

//写入
BufferedStream bs = new BufferedStream(File.Create("123.txt"));
string info = "System.IO 命名空间中的 FileStream 类用于文件的读写与关闭。该类派生自抽象类 Stream。";
byte[] buffer = Encoding.UTF8.GetBytes(info);
bs.Write(buffer,0,buffer.Length);
bs.Flush();
bs.Close();
​
BufferedStream bs = new BufferedStream(File.OpenRead("123.txt"));byte[] buffer =new byte[bs.Length];//  int length = bs.Read(buffer, 0, buffer.Length);
while (bs.Read(buffer, 0, buffer.Length) > 0)
{Console.WriteLine(Encoding.UTF8.GetString(buffer));
}
bs.Close();

5_File类

(1)File类是静态类,不能实例化,直接调用方法

方法说明
Create()用于在指定路径中,创建或者覆盖一个文件
Delete()删除指定路径下的文件
Move()移动,从参数1移动到参数2 Ctrl+X
Copy()复制,从参数1复制到参数2
Exists()确定指定的文件是否存在
WriteAllBytes()文件写 操作的是字节数组
ReadAllBytes()文件读 操作的是字节数组
WriteAllLines文件写 操作的是字符串数组(数组中每一项是一行
ReadAllLines文件读 操作的是字符串数组(数组中每一项是一行
WriteAllText文件写 操作是字符串
ReadAllText文件读 操作是字符串
AppendXXXXXX在原来的基础上追加
//1.Create()  用于在指定路径中,创建或者覆盖一个文件
FileStream fs = File.Create("1.txt");
//2.Delete() 删除一个文件
File.Delete("1.txt");
//3. Move() 移动  Ctrl+X
File.Move(@"D:\001\123.txt", @"D:\002\123.txt");
//4.Copy() 复制 
File.Copy(@"D:\001\123.txt", @"D:\002\123.txt");
//确定文件是存在
bool b= File.Exists("123.txt");
//WriteAllBytes  ReadAllBytes  文件读写  操作的是字节数组
File.WriteAllBytes("123.txt",Encoding.UTF8.GetBytes("需要写入的内容"));
string info = Encoding.UTF8.GetString(File.ReadAllBytes("123.txt"));//WriteAllLines  ReadAllLines 文件读写  操作的是字符串数组(数组中每一项是一行)
string[] infos = { "张三", "李四", "王五" };
File.WriteAllLines("123.txt", infos);
string[] infos= File.ReadAllLines("123.txt");
foreach (string info in infos) 
{Console.WriteLine(info);
}//WriteAllText ReadAllText 文件读写   操作是字符串File.WriteAllText("123.txt", "•比特(bit)•:计算机存储的最小单位,表示一个二进制位,可以是0或1");
string info =  File.ReadAllText("123.txt");// WriteAllBytes WriteAllLines WriteAllText 都会覆盖掉原来的内容,AppendXXXXXX 在原来的基础上追加
AppendAllLines AppendAllText AppendText 
File.AppendText()

6_StreamReader 类和 StreamWriter 类

(1)StreamReader 类继承自抽象基类 TextReader,表示阅读器读取一系列字符。

(2)StreamWriter 类继承自抽象类 TextWriter,表示编写器写入一系列字符。

StreamWriter sw = new StreamWriter("1.txt");
string[] names = new string[] { "张三", "李四", "王五" };
foreach (string name in names)
{sw.WriteLine(name);
}
sw.Close();
​
StreamReader sr = new StreamReader("1.txt");
string line = string.Empty;
while ((line = sr.ReadLine()) != null)
{Console.WriteLine(line);
}
sr.Close();

7_DriveInfo类

(1)C#获取驱动器信息:DriveInfo类详解与示例-CSDN博客

属性说明
AvailableFreeSpace指示驱动器上的可用空闲空间总量(以字节为单位)。
DriveFormat获取文件系统的名称,例如 NTFS 或 FAT32。
DriveType获取驱动器类型,如 CD-ROM、可移动、网络或固定。
IsReady获取一个指示驱动器是否已准备好的值。
Name获取驱动器的名称,如 C:\。
RootDirectory获取驱动器的根目录。
TotalFreeSpace获取驱动器上的可用空闲空间总量(以字节为单位)。
TotalSize获取驱动器上存储空间的总大小(以字节为单位)。
VolumeLabel获取或设置驱动器的卷标。
GetDrives静态方法,检索计算机上所有逻辑驱动器的驱动器名称
DriveInfo driveInfo = new DriveInfo(@"C://");
Console.WriteLine(driveInfo.AvailableFreeSpace);//可用空闲空间总量
onsole.WriteLine(driveInfo.DriveFormat);//获取文件系统的名称
Console.WriteLine(driveInfo.DriveType);// 获取驱动器类型 固定 移动
Console.WriteLine(driveInfo.IsReady); //  是否可用
Console.WriteLine(driveInfo.Name); //  盘符名称

8_文件属性操作(File和FileInfo)

(1)File类与FileInfo都能实现

  • 获取文件属性

    • fileInfo.Attributes FileAttributes(枚举)类型的值

    • File.GetAttributes FileAttributes(枚举)类型的值

  • 设置文件属性

    • fileInfo.Attributes 设置的值为FileAttributes(枚举)类型的值

    • File.SetAttributes 设置的值为FileAttributes(枚举)类型的值

  • 获取文件名:fileInfo.Name

  • 获取文件完整路径和文件名:fileInfo.FullName

  • 获取文件扩展名:fileInfo.Extension

  • 获取文件大小:fileInfo.Length

  • 获取文件的创建时间:fileInfo.CreationTime

  • 获取文件上次修改的时间:fileInfo.LastWriteTime

  • 获取文件上次访问的时间:fileInfo.LastAccessTime

  • 获取文件所在文件夹的名称:fileInfo.DirectoryName

  • 获取文件是否存在:fileInfo.Exists

  • 获取文件是只读:fileInfo.IsReadOnly

(2)FileAttributes值

public enum FileAttributes{ReadOnly = 0x1,Hidden = 0x2,System = 0x4,Directory = 0x10,Archive = 0x20,Device = 0x40,Normal = 0x80,Temporary = 0x100,SparseFile = 0x200,ReparsePoint = 0x400,Compressed = 0x800,Offline = 0x1000,NotContentIndexed = 0x2000,Encrypted = 0x4000,[ComVisible(false)]IntegrityStream = 0x8000,[ComVisible(false)]NoScrubData = 0x20000}

(3)FileInfo需要实例化

 FileInfo fileInfo = new FileInfo(@"D:\001\123.txt");
//获取属性
//Archive 文件    Directory 文件夹
Console.WriteLine(fileInfo.Attributes);
Console.WriteLine(File.GetAttributes(@"D:\001\123.txt"));
Console.WriteLine(File.GetAttributes(@"D:\001"));//设置属性
fileInfo.Attributes=FileAttributes.ReadOnly;//只读属性
fileInfo.Attributes=FileAttributes.Hidden;//隐藏属性// 同时设置只读和隐藏属性
fileInfo.Attributes = FileAttributes.Hidden|FileAttributes.ReadOnly;
File.SetAttributes(@"D:\001\123.txt", FileAttributes.Hidden);
File.SetAttributes(@"D:\001\123.txt", FileAttributes.ReadOnly| FileAttributes.Hidden);Console.WriteLine(fileInfo.Name);//获取文件名
Console.WriteLine(fileInfo.FullName);//获取文件完整路径和文件名
Console.WriteLine(fileInfo.Extension);//获取文件扩展名
Console.WriteLine(fileInfo.Length);//获取文件的大小(字节)
Console.WriteLine(fileInfo.CreationTime);//获取文件的创建时间
Console.WriteLine(fileInfo.LastWriteTime);//获取文件上次修改的时间
Console.WriteLine(fileInfo.LastAccessTime);//获取文件上次访问的时间
Console.WriteLine(fileInfo.DirectoryName);//获取文件上次访问的时间
Console.WriteLine(fileInfo.DirectoryName);//获取文件所在文件夹的名称
Console.WriteLine(fileInfo.Exists);//获取文件是否存在
Console.WriteLine(fileInfo.IsReadOnly);//获取文件是只读

9_文件路径操作(Path)

操作方法返回值
返回当前目录Environment.CurrentDirectory+ "123.txt"完整路径
获取文件或者文件夹所在的目录Path.GetDirectoryName
获取文件的后缀Path.GetExtension(FilePath)
获取文件或者文件夹的名称Path.GetFileName(firPath)
获取绝对路径Path.GetFullPath("ampoules_02.png")
获取根路径 盘符名称Path.GetPathRoot(FilePath)
更改文件的后缀 生成新的路径Path.ChangeExtension(FilePath,".jpg")
根据数组生成路径Path.Combine(new string[] {"C:\","User","123","AAA"})
随机生成文件名Path.GetRandomFileName()

10_文件目录操作(Directory类)

操作方法
创建目录(文件夹)Directory.CreateDirectory(@"F:\C#软件开发7班\2025-08-06\吴亦凡");
获取所有目录下的子文件string [] files =Directory.GetFiles(@"F:\C#软件开发7班\2025-08-06\0806目录和文件的操作\09文件目录操作")
删除文件夹,删除空目录 非空目录无法删除Directory.Delete(@"F:\C#软件开发7班\2025-08-06\吴亦凡");
删除非空目录使用DirectoryInfo 的实例对象 调用Delete() 方法 并且参数设置为true,new DirectoryInfo(@"F:\C#软件开发7班\2025-08-06\吴亦凡").Delete(true)

(2)获取当前目录下所有的文件 (包括目录的子目录,子目录的子目录),使用递归函数: 函数自己调用自己

static void Main(string[] args)
{//创建目录(文件夹)Directory.CreateDirectory(@"D:\001\456");//获取所有目录下的子文件string [] files =   Directory.GetFiles(@"D:\001");foreach (string file in files) {Console.WriteLine(file);}//获取当前目录下所有的文件 (包括目录的子目录,子目录的子目录)//递归函数: 函数自己调用自己GeAllDir(@"D:\001");//注意: 递归要有终止条件,没有终止条件 就是死循环//删除文件夹 :Delete() 删除空目录 非空目录无法删除Directory.Delete(@"D:\001\456");// Directory,删除非空目录//使用DirectoryInfo 的实例对象 调用Delete() 方法  并且参数设置为truenew DirectoryInfo(@"D:\001\456").Delete(true);
}
public static void GeAllDir(string path)
{//GetDirectories() 获取当前目录下所有的子目录string[] dirs=  Directory.GetDirectories(path);foreach (string dir in dirs){Console.WriteLine(dir);if (Directory.GetDirectories(dir).Length>0){GeAllDir(dir);}string[] files = Directory.GetFiles(dir);foreach (string file in files){Console.WriteLine(file);}}
}

11_using

(1)using :1.引入命名空间,2.可以帮助我们完成Close的过程

(2)using (Object) 这个对象的使用范围就在{}中 使用完毕之后会直接释放

(3)using子句:可以帮开发者自动关闭对象,释放对象等操作,让开发者只关注代码

12_总结

  1. 必须掌握的I/O类:文件,目录,路径,驱动相关类

    File、FileInfo、Directory、DirectoryInfo、Path、DriveInfo

  2. File类和FileInfo类都是提供用于创建、复制、删除、移动和打开单一文件的方法,并协助创建 FileStream 对象。 File类是静态类。FileInfo类是密封类。FileInfo类和File类的API相似度高,使用比File类灵活。

    Directory类和DirectoryInfo类都是提供对目录(文件夹)进行创建、移动和枚举(循环、遍历、迭代)。 Directory类是静态类。DirectoryInfo类是密封类。DirectoryInfo类和Directory类的API相似度高,使用比Directory类灵活。

    DriveInfo类提供对有关驱动器(盘符)的信息的访问。

  3. 规律:以Info结尾的是非静态的类,可以实例化。

http://www.dtcms.com/a/346391.html

相关文章:

  • 车载诊断架构 --- EOL引起关于DTC检测开始条件的思考
  • Linux822 shell:expect 批量
  • 《C++起源与核心:版本演进+命名空间法》
  • 易基因:Nat Commun/IF15.7:多组学研究揭示UHRF2在原始生殖细胞DNA甲基化重编程中的抗性调控机制
  • 光耦合器:电子世界的 “光桥梁“
  • Opnecv详细介绍
  • 量子计算基础
  • C#_组合优于继承的实际应用
  • 音视频处理工作室:实时通信的媒体层设计
  • 容器操作案例
  • C语言——内存函数
  • TTS文字合成语音芯片的使用场景
  • No module named blake2b
  • GaussDB GaussDB 数据库架构师修炼(十八)SQL引擎(1)-SQL执行流程
  • ODDR双边沿数据输出
  • 1小时检测cAMP的武功秘籍
  • AI 绘画争议背后:版权归属、艺术原创性与技术美学的三方博弈
  • Linux系统安装llama-cpp并部署ERNIE-4.5-0.3B
  • Unity--判断一个点是否在扇形区域里面(点乘和叉乘的应用)
  • Day2--HOT100--283. 移动零,11. 盛最多水的容器,15. 三数之和
  • 94. 城市间货物运输 I, Bellman_ford 算法, Bellman_ford 队列优化算法
  • 【Android】 连接wifi时,强制应用使用流量
  • 反射【Reflect】
  • 深入浅出【最小生成树】:Prim与Kruskal算法详解
  • 111、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
  • AQS模板方法
  • 使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取
  • 单片机---------WIFI模块
  • Seaborn数据可视化实战:Seaborn数据可视化入门-绘制统计图表与数据分析
  • Dify 从入门到精通(第 49/100 篇):Dify 的自动化测试