IO操作

发布时间 2023-08-12 15:21:41作者: 木影**凌翔
# IO基础概念

**lO操作**:<span style="color:red;font-size:18px;font-weight:700">文件/文件夹</span> 操作与读写。

> <span style="color:red;font-size:23px;font-weight:700">文件夹</span>: 用来管理<span style="color:#5076b4;font-size:18px;font-weight:700">计算机文件</span>的,每一个文件夹对应一块磁盘空间,它提供了指向对应空间的地址它没有扩展名,也就不像文件的格式用扩展名来标识。

> <span style="color:red;font-size:23px;font-weight:700">文件</span>: 一个具有符号的一组相关联元素的有序序列。文件可以包含范围非常广泛的内容。系统和用户都可以将具有一定独立功能的程序模块、一组数据或一组文字命名为一个文件,它具有永久存储。

> <span style="color:red;font-size:23px;font-weight:700">流</span>:是个<span style="color:#5076b4;font-size:18px;font-weight:700">字节序列</span>,可用于对后备存储进行<span style="color:#5076b4;font-size:18px;font-weight:700">读取</span>和<span style="color:#5076b4;font-size:18px;font-weight:700">写入</span>操作,后备存储可以是多个存储媒介之一(例如,磁盘或内存)。

> <span style="color:red;font-size:23px;font-weight:700">Stream</span>:支持读取和写入字节。所有表示流的类都继承自Stream类。

**流涉及三个基本操作:**

- <span style="color:#04050b;font-size:18px;font-weight:700">读取</span> - 将数据从流传输到数据结构 (如字节数组) 中。
- <span style="color:#04050b;font-size:18px;font-weight:700">写入</span>- 将数据从数据源传输到流。
- <span style="color:#04050b;font-size:18px;font-weight:700">查找 </span>- 对流中的当前位置进行查询和修改。

## IO命名空间常用类

> <span style="color:#04050b;font-size:18px;font-weight:700">System.lO命名空间里,常用的类:</span>

1. <span style="color:red;font-size:23px;font-weight:700">File</span>
2. <span style="color:red;font-size:23px;font-weight:700">Filelnfo.Directory</span>
3. <span style="color:red;font-size:23px;font-weight:700">Directorylnfo</span>
4. <span style="color:red;font-size:23px;font-weight:700">Path</span>
5. <span style="color:red;font-size:23px;font-weight:700">StreamReader</span>
6. <span style="color:red;font-size:23px;font-weight:700">StreamWriterFileStream</span>
7. <span style="color:red;font-size:23px;font-weight:700">MemoryStream</span>
8. <span style="color:red;font-size:23px;font-weight:700">BufferedStream</span>
9. <span style="color:red;font-size:23px;font-weight:700">BinaryReader</span>
10. <span style="color:red;font-size:23px;font-weight:700">BinaryWriter</span>
11. <span style="color:red;font-size:23px;font-weight:700">StringReader</span>
12. <span style="color:red;font-size:23px;font-weight:700">StringWriter</span>
13. <span style="color:red;font-size:23px;font-weight:700">Stream </span>
14. <span style="color:red;font-size:23px;font-weight:700">TextReader</span>
15. <span style="color:red;font-size:23px;font-weight:700">TextWriter</span>

![image-20230712161753286](C:\Users\82483\AppData\Roaming\Typora\typora-user-images\image-20230712161753286.png)

# 1.文件路径操作:Path类简介

C#中的Path类提供了许多用于处理文件路径的方法。其中最常用的方法是GetFileName、GetFileNameWithoutExtension和GetDirectoryName。这些方法分别返回路径的文件名、不带扩展名的文件名以及文件夹目录的名称。此外,Path类还提供了GetFullPath方法,可以获取完整的文件路径。

在使用Path类时,需要先在路径的头部加上@符号,例如@C:\fuck.txt 。这样可以确保路径被正确解析并返回正确的结果。

除了常用的方法外,Path类还提供了一些其他有用的方法,例如CreateDirectory、Delete、Move等,可以用来创建、删除或移动文件或文件夹。同时,Path类还支持正则表达式,可以使用Regex类来进行复杂的路径匹配和处理。

总之,C#中的Path类是一个非常实用的工具,可以帮助我们方便地处理文件路径并进行各种操作。

C#中的Path类提供了一组方法,用于处理文件路径和目录。以下是一些常见的用法:

1. 创建文件路径字符串:使用CreateDirectory、CreateFile或Combine方法创建一个文件路径字符串。例如:string path = Path.Combine(“C:\Users\JohnDoe”, “Documents”, “myfile.txt”);
2. 获取当前工作目录:使用CurrentDirectory属性返回当前工作目录的路径。
3. 获取完整路径:使用FullName属性返回完整路径,包括驱动器和文件夹名称。
4. 获取只读文件路径:使用IsReadOnly属性检查文件是否为只读模式。
5. 获取隐藏文件路径:使用IsHidden属性检查文件是否为隐藏模式。
6. 获取系统文件路径:使用SystemFiles属性返回包含系统文件的目录列表。
7. 获取扩展名:使用Extension属性返回文件扩展名。
8. 获取文件名:使用FileName属性返回文件名。
9. 获取文件大小:使用Length属性返回文件的大小(以字节为单位)。
10. 获取文件类型:使用Type属性返回文件的类型(如文本文件、图像文件等)。
11. 删除文件:使用Delete方法删除指定路径的文件。
12. 移动文件:使用Move方法将文件从一个位置移动到另一个位置。
13. 复制文件:使用Copy方法将文件从一个位置复制到另一个位置。
14. 列出目录内容:使用EnumerateDirectories和EnumerateFiles方法分别列出指定目录下的所有子目录和所有文件。

总之,Path类提供了许多有用的方法和属性,可以方便地处理文件路径和目录。

> 定义 string filePath =@"E:/project/test/20180322.jpg";

|                         方法                         |                      备注                      |                             效果                             |
| :--------------------------------------------------: | :--------------------------------------------: | :----------------------------------------------------------: |
|   System.IO.Path.ChangeExtension(filePath, "txt")    |             更改路径字符串的扩展名             |                 E:/project/test/20180322.txt                 |
|      System.IO.Path.GetDirectoryName(filePath)       |          返回指定路径字符串的目录信息          |                       E:/project/test/                       |
|        System.IO.Path.GetExtension(filePath)         |          返回指定的路径字符串的扩展名          |                             .jpg                             |
|         System.IO.Path.GetFileName(filePath)         |       返回指定路径字符串的文件名和扩展名       |                         20180322.jpg                         |
| System.IO.Path.GetFileNameWithoutExtension(filePath) |    返回不具有扩展名的指定路径字符串的文件名    |                           20180322                           |
|         System.IO.Path.GetPathRoot(filePath)         |            获取指定路径的根目录信息            |                             E:/                              |
|          System.IO.Path.GetRandomFileName()          |            返回随机文件夹名或文件名            |                         ct2h5b2h.sed                         |
|           System.IO.Path.GetTempFileName()           | 创建唯一命名的零字节的临时文件并返回其绝对路径 | C:/Documents and Settings/Randy/Local Settings/Temp/tmpAD.tmp |
|             System.IO.Path.GetTempPath()             |         返回当前系统的临时文件夹的路径         |     C:/Documents and Settings/Randy/Local Settings/Temp/     |
|        System.IO.Path.HasExtension(filePath)         |           返回路径是否包括文件扩展名           |                             True                             |
|        System.IO.Path.IsPathRooted(filePath)         |         返回路径是绝对路径还是相对路径         |                             Ture                             |
|      System.IO.Path.Combine(@ "c: ", "b.txt ")       |                返回合并后的路径                |                           C:/b.txt                           |
|      System.IO.Path.GetFullPath("20180322.jpg")      |            查找文件并返回其绝对路径            |                 E:/project/test/20180322.jpg                 |

# 2.文件夹操作:DirectoryInfo类与Directory类操作

> Directory类位于System.IO命名空间下,主要用来操作文件夹,常用操作有判断文件夹是否存在、创建文件夹、删除文件夹、剪切文件夹、获取文件夹下的全部或指定格式文件

>`DirectoryInfo`类是一个密封类,它可以用来创建、移动、枚举目录和子目录。

### Directory

#### 创建一个文件夹;如果文件夹已经存在,就什么都不干:Directory.CreateDirectory

> 例:Directory.CreateDirectory(@"c:\a");这里是在C盘创建一个名为a的文件夹。

#### 删除一个文件夹:Directory.Delete

默认的第二个参数是false,只能删除空目录;第二个参数为true的时候就可以删除文件夹连同文件夹里的所有文件。

> 例:Directory.Delete(@"c:\a",true);这里是删除C盘名为a文件夹。

#### 移动文件夹的位置:Directory.Move

> 例:Directory.Move(@"c:\a", @"d:\new");将C盘a文件夹移动到d盘变成名为new的文件夹。

#### 判断文件夹是否存在,返回布尔类型:Directory.Exists

> 例:Directory.Exists(@"c:\a");判断C盘名为a的文件夹是否存在。

#### 获取目录下的所有文件的路径,返回到字符串数组:Directory.GetFiles

> 例:第二个参数是筛选出只有jpg格式的文件,如果不填第二个参数,则返回全部文件。
> string[] path=Directory.GetFiles(@"c:\a","*.jpg");遍历C盘a文件夹里面jpg格式的文件路径,并且保存在path数组里面。

#### 获取目录下所有文件夹的路径,返回字符串数组:Directory.GetDirectories

> 例:string[] path = Directory.GetDirectories(@"c:\a");遍历C盘a文件夹下所有的文件夹路径,并保存到path数组里面。

### DirectoryInfo

DirectoryInfo类包括4个属性,可以用来获取目录的名称、父目录等。

- Exists:判断指定目录是否存在。如果存在,则返回true,否则返回false。

- Name:获取目录的名称。

- Parent“获取指定子目录的父目录。

- Root:获取路径的根部分。

  DirectoryInfo类还包括了以下9个属性,它们是从FileSystemInfo类继承而来。

- Extension属性:获取文件扩展名部分。
- FullName属性:获取完整目录。
- Attributes属性:获取或设置当前目录的FileAttributes。
- CreationTime属性:获取或设置当前目录的创建时间。
- CreationTimeUtc属性:获取或设置当前目录的创建时间,其格式为协调通用时间。
- LastAccessTime属性:获取或设置上次访问当前目录的时间。
- LastAccessTimeUtc属性:获取或设置上次访问当前目录的时间,其格式为协调通用时间。
- LastWriteTime属性:获取或设置上次写入当前目录的时间。
- LastWriteTimeUtc属性:获取或设置上次写入当前目录的时间,其格式为协调通用时间。
- DirectoryInfo类的实例方法说明
- Create():创建目录。
- GetDirectories():获取当前目录的子目录。
- CreateSubdirectory():在指定路径中创建一个或多个子目录。
- GetFiles():获取当前目录的文件列表。
- Delete():删除指定的目录及其内容。
- GetFileSystemInfos():获取当前目录的子目录和文件列表。
- MoveTo():将指定目录及其内容移到新位置。

其中,Create()、Delete()和MoveTo()方法用来操作目录,它们依次可以用来创建、删除和移动目录。MoveTo()方法用来移动目录,它首先创建一个新目录(包括该目录的内容),然后再将被移动的目录删除。

Directory类和DirectoryInfo类的区别

- Directory是公用的静态类,是公开建立、移动和全面列举目录和子目录的静态方法。
- DirectoryInfo是实例类,是公开建立、移动和全面列举目录内和子目录的容执行个体 (Instance) 方法。

## 3.文件操作:File、FileInfo类

> <span style="color:red;font-size:23px;font-weight:700">File</span> :提供用于<span style="color:#5076b4;font-size:18px;font-weight:700">创建</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">复制</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">删除</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">移动</span>和<span style="color:#5076b4;font-size:18px;font-weight:700">打开</span>文件的<span style="color:#5076b4;font-size:18px;font-weight:700">静态方法</span>,并协助创建<span style="color:#5076b4;font-size:18px;font-weight:700">FileStream</span>对象。

> <span style="color:red;font-size:23px;font-weight:700">Filelnfo</span> :提供用于<span style="color:#5076b4;font-size:18px;font-weight:700">创建</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">复制</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">删除</span>、<span style="color:#5076b4;font-size:18px;font-weight:700">移动</span>和<span style="color:#5076b4;font-size:18px;font-weight:700">打开</span>文件的<span style="color:#5076b4;font-size:18px;font-weight:700">实例方法</span>,并协助创建<span style="color:#5076b4;font-size:18px;font-weight:700">FileStream</span> 对象。

> <span style="color:red;font-size:23px;font-weight:700">FileMode</span>:打开文件的方式  <span style="color:#5076b4;font-size:18px;font-weight:700">Create</span>  <span style="color:#5076b4;font-size:18px;font-weight:700">CreateNew</span>  <span style="color:#5076b4;font-size:18px;font-weight:700">Append</span>  <span style="color:#5076b4;font-size:18px;font-weight:700">Open</span>   <span style="color:#5076b4;font-size:18px;font-weight:700">OpenOrCreate</span>

> <span style="color:red;font-size:23px;font-weight:700">FlleAccess</span>:   文件访问权限   <span style="color:#5076b4;font-size:18px;font-weight:700">Read</span>  <span style="color:#5076b4;font-size:18px;font-weight:700">Write</span>  <span style="color:#5076b4;font-size:18px;font-weight:700">ReadWrite</span>

<span style="color:#5076b4;font-size:18px;font-weight:700">创建  复制  删除  移动</span>                             <span style="color:red;font-size:18px;font-weight:700">文件流   写入流   读取   </span>  

<span style="color:#5076b4;font-size:18px;font-weight:700">打开  追加  写入  读取   </span>                    

File类包含用于将内容写入文件的4种方法:

- WriteAllText():创建文本,将字符串写入该文件,关闭文件
- AppendAllText():将字符串附加到已有的文件
- WriteAllLines():创建文件,将字符串数组写入该文件,关闭文件
- WriteAllBytes():创建文件,将字节数组写入该文件,关闭文件

File类也包含用于从文件读取内容的3种方法:

- ReadAllText():打开文件,读取该文件中的所有文本并放入字符串中,关闭文件
- ReadAllLines():打开文件,读取该文件中的所有文本并放入字符串数组中,关闭文件
- ReadAllBytes():打开文件,读取该文件中的所有文本并放入字节数组中,关闭文件