这个将难以想象

时间:2022-01-21 06:06:10

如何去理解FileStream?

通过前3章的学习相信大家对付Stream已经有必然的了解,但是又如何去理解FileStream呢?请看下图  

我们磁盘的中任何文件都是通过2进制构成,最为直不雅观的等于记事本了,当我们新建一个记事本时,它的巨细是0KB, 我们每次输入一个数字或

字母时文件便会自动增大4kb,可见跟着我们输入的内容越来越多,文件也会相应增大,同理当我们删除文件内容时,文件也会相应减小,对了,

聪明的你必定会问:谁将内容以怎么样的形式放到文件中去了?好问题,还记得第一篇流的观点么?对了,真实世界的一群鱼可以通过河流来

往于各个处所,FileStream也是一样,byte可以通过FileStream进行传输,这样我们便能在计算机上对任何文件进行一系列的操纵了。

FileStream 的重要性

FileStream 顾名思义文件流,我们电脑上的文件都可以通过文件流进行操纵,例如文件的复制,剪切,粘贴,删除, 本地文件上传,下载,等许

多重要的成果都离不开文件流,所以文件流不只在本机上非常重要,在如今的网络世界也是万万不能缺少的,想象一下我们开启虚机后,直接从本

地复制一个文件到虚机上,是何等便利,如果没有文件流,这个将不行思议。(大家别误解,文件流无法直接通过网络进行传输,而是

通过网络流将客户端上传的文件传随处事器端接收,然后通过文件流进行措置惩罚惩罚,下载正好相反)

FileStream 常用结构函数介绍(可能理解上有点庞大,请大家务必深刻理解)

*1: FileStream(SafeFileHandle, FileAccess)

非托管参数SafeFileHandle简单介绍

SafeFileHandle :是一个文件安适句柄,这样的解释可能大家一头雾水,

别急,大家先不要去理睬这深邃的含义,只要知道这个类型是c#非托管资源,

也就是说它能够挪用非托管资源的要领,而且不属于c#回收机制,所以我们必需

使用GC手动或其他方法(Finalize 或Dispose要领)进行非托管资源的回收,所以

SafeFileHandle是个默默无闻的保镖 ,一直黑暗掩护FileStream和文件的安适

为了能让大家更好的理解这个保镖,请看第一段代码:

会什么会报错呢?其实措施被卡在 Console.ReadLine()这里,FileStream并没有

被释放,系统不知道这个文件是否还有用﹐所以帮我们掩护这个文件

(阿谁非托管资源SafeFileHandle所使用的内存还被措施占用着)

所以SafeFileHandled 在内部掩护了这个文件从而报出了这个异常

如果我们将流*后,这个问题也就不存在了

可以看见stream.SafeFileHandle的IsClose属性酿成true了,也就是说这时候可以安适的删除文件了 

所以又回到了一个老问题上面,我们每次使用完FileStream后都必需将他*并释放资源

*2: FileStream(String, FileMode)

String 参数暗示文件地址的地点,FIleMode是个枚举,暗示确定如何打开或创建文件。

FileMode枚举参数包罗以下内容:

成员名称

 

说明

 

Append

 

打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。

 

Create

 

指定操纵系统应创建新文件。如果文件已存在,它将被改写。这要求 FileIOPermissionAccess.Write。

System.IO.FileMode.Create 等效于这样的请求:如果文件不存在,则使用 CreateNew;否则使用 Truncate。

 

CreateNew

 

指定操纵系统应创建新文件。此操纵需要 FileIOPermissionAccess.Write。如果文件已存在,则将引发 IOException。

 

Open

 

指定操纵系统应打开现有文件。打开文件的能力取决于 FileAccess   所指定的值。如果该文件不存在,

则引发 System.IO.FileNotFoundException。

 

OpenOrCreate

 

指定操纵系统应打开文件(如果文件存在);否则,应创建新文件。如果用 FileAccess.Read   打开文件,则需要

FileIOPermissionAccess.Read。如果文件访谒为 FileAccess.Write 或 FileAccess.ReadWrite,则需要

FileIOPermissionAccess.Write。如果文件访谒为 FileAccess.Append,则需要 FileIOPermissionAccess.Append。

 

Truncate

 

指定操纵系统应打开现有文件。文件一旦打开,就将被截断为零字节巨细。此操纵需要 FileIOPermissionAccess.Write。

试图从使用 Truncate 打开的文件中进行读取将导致异常。

 

*3: FileStream(IntPtr, FileAccess, Boolean ownsHandle)

FileAccess 参数也是一个枚举, 暗示对付该文件的操纵权限

ReadWrite

 

对文件的读访谒和写访谒。可从文件读取数据和将数据写入文件

 

Write

 

文件的写访谒。可将数据写入文件。同 Read组合即组成读/写访谒权

 

Read

 

对文件的读访谒。可从文件中读取数据。同 Write组合即组成读写访谒权

 

参数ownsHandle:也就是类似于前面和大家介绍的SafeFileHandler,有2点必需注意:

1对付指定的文件句柄,操纵系统不允许所请求的 access,例如,当 access 为 Write 或 ReadWrite 而文件句柄设置为只读访谒时,会报出异常。

所以 ownsHandle才是老大,FileAccess的权限应该在ownsHandle的范畴之内

2. FileStream 假定它对句柄有独有控制权。当 FileStream 也持有句柄时,读取、写入或查找可能会导致数据粉碎。为了数据的安适,请使用

句柄前挪用 Flush,并制止在使用完句柄后挪用 Close 以外的任何要领。

*4: FileStream(String, FileMode, FileAccess, FileShare)

FileShare:同样是个枚举类型:确定文件如何由进程共享。   

Delete

 

允许随后删除文件。

 

Inheritable

 

使文件句柄可由子进程担任。Win32 不直接撑持此成果。

 

None

 

谢绝共享当前文件。文件*前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将掉败。

 

Read