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:\tianyi.txt", FileMode.CreateNew, FileAccess.Write);     //在E盘下创建了E:\tianyi.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 
时间: 2024-08-06 03:44:15

FileStream类的相关文章

C#-I/O输入输出之FileStream类

I/O数据流提供一种向后备存储读取字节的方式,它是在.NET Framework中执行读写文件操作时的一种非常重要的介质. 我们可以将流视为一组连续的一维数据,包含开头和结尾,并且其中的游标指示了流中的当前位置. 1.流操作 流中包含的数据可能来自内存.文件或TCP/IP套接字,基本操作: (1)读取:将数据从流传输到数据结构(如字符串货字节数组)中 (2)写入:将数据从数据源传输到流中 (3)查找:查询和修改在流中的位置 2.流类型 流由Stream类表示,该类构成了所有其他流的抽象类.不恩给

FileStream类的使用

1.什么是FileStream类 FileStream 类对文件系统上的文件进行读取.写入.打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道.标准输入和标准输出.读写操作可以指定为同步或异步操作.FileStream 对输入输出进行缓冲,从而提高性能.--MSDN 简单点说:FileStream类可以对任意类型的文件进行读取操作,而且我们也可以根据自己需要来指定每一次读取字节长度,以此减少内存的消耗,提高读取效率. 2.File和FileStream的区别  直观点:File是一

FileStream 类读写操作

1.读取 static void Main(string[] args) { /* * File类最大的问题是,一次性读取,如果文件较大的话,会给内存造成很大压力. * 文件流:把一个较大的文件,可以分成一点一点的读取和写入,内存压力很小. * 三种文件流类:FileStream:操作字节(byte),可读可写,可以操作任何文件. * StreamReader+StreamWriter:操作字符,操作文本文件. */ //1.创建文件流对象 string path=@"D:\CSharp_Net

asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样

方法一: //这个值可以从配置文件读取,或者放个textbox让用户填 string path = "你的路径";FileStream outputStream = new FileStream(path , FileMode.Create); 方法二: 直接用Response内置对象把文件以流的形式传到前端,浏览器自动就会识别下载了

C# 基础知识-08----.NET中FileStream 类 和 StreamReader类 和 BinaryRead 类

C#对文件/目录的操作:Path、File、Directory、FileStream、StreamWriter、StreamReader等类的浅析

一.Path:主要对文件路径的操作! 常用方法: String [email protected]"C:\a\b\c\123.txt"; 1-1.Path.GetFileName(path); //获得文件名:123.txt 1-2.Path.GetExtenSion(path); //获得后缀名:.txt 1-3.Path.GetFileNameWithoutExtension(path); //获得无后缀文件名:123 1-4.Path.GetDirectoryName(path)

日志记录类(明确FileStream\Dictionary等用法)

一个好的程序对于日志的处理是必不可少的.好的日志记录可以帮助我们减少更好的查找错误和系统的维护.今天整理一下自己工作中平时用来记录日志的类,同时也补补基础知识. 功能: 根据程序App.config中配置的路径,创建日志文件并将程序的日志写到相应的文件中. 首先来看一下我之前自己写的一个用于写日志的类,源代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

FileStream读写文件【StreamWriter 和 StreamReader】

FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能.这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据.字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行.其中创建FileStream对象最简单的构造函数如下: 1        FileStream file = new FileS

利用FileStream实现多媒体文件复制

    利用FileStream实现多媒体文件复制的主要思路在于利用两个FileStream对象,一个读取字节,另一个对象写入字节既可.     涉及知识点: 1.通常我们操作的File类,FileStream,StreamWriter,StreamReader都是在System.IO命名空间下的. 2.File类和FileStream类操作文件的区别在于,File相当于一次性读取或写入整个文件,可能会增加内存负担,而使用FileStream则可以在读取或者写入的时候指定操作的字节数(有点类似于