第二阶段WinForm-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() 方法  并且参数设置为true
    new 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结尾的是非静态的类,可以实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值