如何去理解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