FileStream类

使用FileStream能够对对系统上的文件进行读、写、打开、关闭等操作。并对其他与文件相关的操作系统提供句柄操作,如管道,标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高性能。

  FileStream 对象支持使用 Seek 方法对文件进行随机访问。Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由 SeekOrigin 类的三个属性表示。

  FileStream会自动缓冲数据,通过Flush()能够强制输出缓冲区中的数据。FileStream和其他流都会占用不在.net管理范围的资源,因此FileStream在使用完成之后应该调用Dispose()方法或者通过using关键字调用。Dispose()方法会调用Close()方法,Close()方法会调用Flush()方法。这就是为什么在释放资源前,会自动输出缓冲区内的数据。

  FileStream中用到了好几个枚举,因此有必须对这些枚举的有一定的了解,首先先来看看FileMode枚举,FileMode枚举是一个简单枚举,用于指定操作系统打开文件的方式。更详细请查看:http://www.cnblogs.com/kissdodog/archive/2013/01/19/2868125.html

 
枚举成员    成员值        描述

CreateNew    1         指定操作系统应创建新文件,如果文件存在则引发异常。
Create      2         指定操作系统创建新文件,如果文件已存在则覆盖之。
OPen        3         指定 操作系统应打开现有文件,如果文件不存在则抛出异常。
OpenOrCreate  4         指定操作系统应打开文件,如果文件不存在则创建之。
Truncate     5         指定操作系统打开现有文件,如果文件已存在则清空,从Truncate打开的文件中读取将引发异常。
Append      6         若文件存在,则找到文件并找到文件结尾,或者创建一个新文件。  
 

  再下来是FileAccess枚举,FileAccess用于控制对文件的读访问、写访问或读/写访问的常熟。从源代码可以看到FileAccess是一个简单枚举。

枚举成员        成员值          描述

Read           1           对文件的读访问,拥有读取权限。
Write           2           对文件的写访问,拥有写入权限。
ReadWrite        3           对文件的读访问和写访问,拥有读取和写入两个权限。

一、构造函数

  FileStream的构造函数居然有15个之多。总之就是new就行了。

二、公共属性

CanRead         获取一个值,该值指示当前流是否支持读取。

CanSeek         获取一个值,该值指示当前流是否支持查找。

CanTimeout        获取一个值,该值确定当前流是否可以超时。(从 Stream 继承。)

CanWrite        获取一个值,该值指示当前流是否支持写入。

Handle        获取当前 FileStream 对象所封装文件的操作系统文件句柄。

IsAsync       获取一个值,该值指示 FileStream 是异步还是同步打开的。

Length        获取用字节表示的流长度。

Name          获取传递给构造函数的 FileStream 的名称。

Position           获取或设置此流的当前位置。

ReadTimeout       获取或设置一个值,该值指示尝试读取多长时间后超时。

SafeFileHandle     获取 SafeFileHandle 对象,该对象表示当前 FileStream 对象封装的文件的操作系统文件句柄。

WriteTimeout      获取或设置一个值,该值确定流在超时前尝试写入多长时间。 (从 Stream 继承。)

三、公共方法

BeginRead       已重写。 开始异步读。

BeginWrite        已重写。 开始异步写。 

Close          关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (从 Stream 继承。)

CreateObjRef       创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (从 MarshalByRefObject 继承。)

Dispose        已重载。释放流所占用的资源。

EndRead         已重写。 等待挂起的异步读取完成。 

EndWrite        已重写。 结束异步写入,在 I/O 操作完成之前一直阻止。 

Flush          已重写。 清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。 

GetAccessControl   获取 FileSecurity 对象,该对象封装当前 FileStream 对象所描述的文件的访问控制列表 (ACL) 项。 

GetLifetimeService    检索控制此实例的生存期策略的当前生存期服务对象。 (从 MarshalByRefObject 继承。)

InitializeLifetimeService   获取控制此实例的生存期策略的生存期服务对象。 (从 MarshalByRefObject 继承。)

Lock           允许读取访问的同时防止其他进程更改 FileStream。 

Read           已重写。 从流中读取字节块并将该数据写入给定缓冲区中。 

ReadByte        已重写。 从文件中读取一个字节,并将读取位置提升一个字节。 

Seek           已重写。 将该流的当前位置设置为给定值。 

SetAccessControl    将 FileSecurity 对象所描述的访问控制列表 (ACL) 项应用于当前 FileStream 对象所描述的文件。 

SetLength       已重写。 将该流的长度设置为给定值。 

Synchronized       在指定的 Stream 对象周围创建线程安全(同步)包装。 (从 Stream 继承。)

Unlock         允许其他进程访问以前锁定的某个文件的全部或部分。 

Write          已重写。 使用从缓冲区读取的数据将字节块写入该流。 

WriteByte       已重写。 将一个字节写入文件流的当前位置。

以下给出代码示例(注意using或Dispose(),此处略过了):

 
            FileStream fs = new FileStream(@"E:file.txt", FileMode.Create);   //打开一个写入流
            Console.WriteLine(fs.CanRead);  //该属性值指示文件是否可读  True
            Console.WriteLine(fs.CanSeek);  //该属性值指示文件是否支持查找    True
            Console.WriteLine(fs.CanTimeout);    //该属性值指示文件是否支持超时   False
            Console.WriteLine(fs.CanWrite); //该属性值指示文件是否可写  True
            Console.WriteLine(fs.IsAsync);  //该属性值指示文件是否是异步打开,异步打开则返回true,同步打开则返回false False
            Console.WriteLine(fs.Length);   //获取用字节流表示的长度   16    与硬盘中显示的大小一样。
            Console.WriteLine(fs.Name);     //获取传递给构造函数的文件名称  E:file.txt
            Console.WriteLine(fs.Position); //获取和设置此流的当前位置,注意此方法是可赋值设置的。    0   fs.Position = 100;
            //Console.WriteLine(fs.ReadTimeout);  //获取和设置一个值,该值指示尝试读取多长时间后超时,可以赋值超时,如果流上不支持超时(即fs.CanTimeout为false)则引发异常。
            //Console.WriteLine(fs.WriteTimeout); //获取和设置一个值,尝试写入多长时间后算超时。如果不支持超时(即fs.CanTimeout为false)则引发异常。

            //写入流
            string str = "你好吗?";
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            fs.Write(bytes, 0, bytes.Length);
            fs.Flush();     //流会缓冲,此行代码指示流不要缓冲数据,立即写入到文件。
            fs.Close();     //关闭流并释放所有资源,同时将缓冲区的没有写入的数据,写入然后再关闭。
            fs.Dispose();   //释放流所占用的资源,Dispose()会调用Close(),Close()会调用Flush();    也会写入缓冲区内的数据。

            //写入流,追加文本
            FileStream fs = new FileStream(@"E:file.txt", FileMode.Append, FileAccess.Write);  //追加流,权限设置为可写
            byte[] bytes = Encoding.UTF8.GetBytes("好想回家过年了!");
            fs.Write(bytes, 0, bytes.Length);
            fs.Flush();         //E:file.txt文本变为   你好吗?好想回家过年了!    原来文本的内容是:你好吗?

            //写入流,逐个字符逐个字符吸入
            FileStream fs = new FileStream(@"E:	ianyi.txt", FileMode.CreateNew, FileAccess.Write);     //在E盘下创建了E:	ianyi.txt并写入   天意啊!
            byte[] bytes = Encoding.UTF8.GetBytes("天意啊!");
            foreach (byte b in bytes)
            {
                fs.WriteByte(b);        //逐个字节逐个字节追加入文本
            }
            fs.Flush();

            //读取内容
            FileStream fs1 = new FileStream(@"E:file.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
            byte[] bytes = new byte[fs1.Length];
            fs1.Read(bytes, 0, fs1.Length);
            Console.WriteLine(Encoding.UTF8.GetString(bytes));  //将读取到的值获取成字符串输出

            //逐个字符读取
            FileStream fs = new FileStream(@"E:file.txt", FileMode.Open, FileAccess.ReadWrite);
            byte[] bytes = new byte[fs.Length];
            for (int i = 0; i < fs.Length; i++)
            {
                bytes[i] = (byte)fs.ReadByte();     //逐个字节逐个字节的读取,当读取完之后会自动将当前读取位置移动到下一位
            }
            Console.WriteLine(Encoding.UTF8.GetString(bytes));      //输出E:file.txt的文本内容  "你好吗"


            //未明白的东西
            //fs.Handle
            //fs.SafeFileHandle
            //CreateObjRef 
            //GetAccessControl
            //GetLifetimeService
            //InitializeLifetimeService
            //SetAccessControl
            //Synchronized 
原文地址:https://www.cnblogs.com/feng-NET/p/4542402.html