第二节阶段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_总结
-
必须掌握的I/O类:文件,目录,路径,驱动相关类
File、FileInfo、Directory、DirectoryInfo、Path、DriveInfo
-
File类和FileInfo类都是提供用于创建、复制、删除、移动和打开单一文件的方法,并协助创建 FileStream 对象。 File类是静态类。FileInfo类是密封类。FileInfo类和File类的API相似度高,使用比File类灵活。
Directory类和DirectoryInfo类都是提供对目录(文件夹)进行创建、移动和枚举(循环、遍历、迭代)。 Directory类是静态类。DirectoryInfo类是密封类。DirectoryInfo类和Directory类的API相似度高,使用比Directory类灵活。
DriveInfo类提供对有关驱动器(盘符)的信息的访问。
-
规律:以Info结尾的是非静态的类,可以实例化。