C#中的文件处理(1)

原文地址:http://www.dingos.cn/index.php?topic=1408.0


【IO 命名空间和它类】
System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
System.IO 命名空间包含便于在数据流和文件中读取和写入数据的类
System.IO 命名空间中用于处理文件的类:BinaryReader、TextWriter、BinaryWriter、Directory、Stream、File、TextReader、FileSystemInfo

【BinaryReader 和 BinaryWriter】它们都派生自System.Object类;这些类用于设置二进制数据的格式;可以从任何C#变量中读取数据并写入指定的流中。
BinaryReader 类:用特定的编码将基元数据类型读作二进制值。
BinaryWriter 类:用于将二进制数据从C#变量中写入指定的流中。

【BinaryReader 类】用特定的编码将基元数据类型读作二进制值。
常见方法:
  • Close
    关闭当前阅读器及基础流。
  • Dispose
    释放由 BinaryReader 占用的非托管资源,还可以另外再释放托管资源。
  • Read
    从基础流中读取字符,并提升流的当前位置
  • ReadBoolean
    从当前流中读取 Boolean 值,并使该流的当前位置提升 1 个字节。
  • ReadByte
    从当前流中读取下一个字节,并使流的当前位置提升 1 个字节。
  • ReadBytes
    从当前流中将 count 个字节读入字节数组,并使当前位置提升 count 个字节。
  • ReadChar
    从当前流中读取下一个字符,并根据所使用的 Encoding 和从流中读取的特定字符,提升流的当前位置。
  • ReadChars
    从当前流中读取 count 个字符,以字符数组的形式返回数据,并根据所使用的 Encoding 和从流中读取的特定字符,提升当前位置。
  • ReadDecimal
    从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。
  • ReadDouble
    从当前流中读取 8 字节浮点值,并使流的当前位置提升 8 个字节。
  • ReadInt16
    从当前流中读取 2 字节有符号整数,并使流的当前位置提升 2 个字节。
  • ReadInt32
    从当前流中读取 4 字节有符号整数,并使流的当前位置提升 4 个字节。
  • ReadInt64
    从当前流中读取 8 字节有符号整数,并使流的当前位置向前移动 8 个字节。
  • ReadSByte
    从此流中读取一个有符号字节,并使流的当前位置提升 1 个字节。
  • ReadSingle
    从当前流中读取 4 字节浮点值,并使流的当前位置提升 4 个字节。
  • ReadString
    从当前流中读取一个字符串。字符串有长度前缀,一次 7 位地被编码为整数。
  • ReadUInt16
    使用 Little-Endian 编码从当前流中读取 2 字节无符号整数,并将流的位置提升 2 个字节。
  • ReadUInt32
    从当前流中读取 4 字节无符号整数并使流的当前位置提升 4 个字节。
  • ReadUInt64
    从当前流中读取 8 字节无符号整数并使流的当前位置提升 8 个字节。

【BinaryWriter 类】以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
常见方法:
  • Close
    关闭当前的 BinaryWriter 和基础流。
  • Dispose
    释放由 BinaryWriter 占用的非托管资源,还可以另外再释放托管资源。
  • Flush
    清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备。
  • Seek
    设置当前流中的位置。
  • Write
    将值写入当前流。

【Stream 类】提供字节序列的一般视图。
流涉及三个基本操作:
  • 可以读取流。读取是从流到数据结构(如字节数组)的数据传输。
  • 可以写入流。写入是从数据结构到流的数据传输。
  • 流可以支持查找。查找是对流内的当前位置进行查询和修改。查找功能取决于流具有的后备存储区类型。

Stream 是所有流的抽象基类。流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道或者 TCP/IP 套接字。Stream 类及其派生类提供这些不同类型的输入和输出的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
根据基础数据源或储存库,流可能只支持这些功能中的一部分。通过使用 CanRead、CanWrite 和 CanSeek 属性,应用程序可以查询流的功能。
Read 和 Write 方法读写各种不同格式的数据。对于支持查找的流,使用 Seek 和 SetLength 方法以及 Position 和 Length 属性可查询和修改流的当前位置和长度。
有些流实现执行基础数据的本地缓冲以提高性能。对于这样的流,Flush 方法可用于清除所有内部缓冲区并确保将所有数据写入基础数据源或储存库。
在 Stream 上调用 Close 将刷新所有经过缓冲处理的数据。Close 也会释放操作系统资源,如文件句柄、网络连接或用于任何内部缓冲的内存。BufferedStream 类提供了将一个经过缓冲的流环绕另一个流的功能,以便提高读写性能。
在实现 Stream 的派生类时,必须提供 Read 和 Write 方法的实现。异步方法 BeginRead、EndRead、BeginWrite 和 EndWrite 通过同步方法 Read 和 Write 实现。同样,Read 和 Write 的实现也将与异步方法一起正常工作。ReadByte 和 WriteByte 的默认实现创建一个新的单元素字节数组,然后调用 Read 和 Write 的实现。当从 Stream 派生时,如果有内部字节缓冲区,则强烈建议重写这些方法以访问内部缓冲区,这样性能将得到显著提高。还必须提供 CanRead、CanSeek、CanWrite、Flush、Length、Position、Seek 和 SetLength 的实现。
不要重写 Close 方法,而应将所有 Stream 清理逻辑放入 Dispose 方法中。

其中的一些派生类包括
  • MemoryStream
  • BufferedStream
  • FileStream
  • NetworkStream
  • CryptoStream

【MemoryStream 类】MemoryStream 类创建这样的流,该流以内存而不是磁盘或网络连接作为支持存储区。MemoryStream 封装以无符号字节数组形式存储的数据,该数组在创建 MemoryStream 对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。
流的当前位置是下一个读取或写入操作可能发生的位置。当前位置可以通过 Seek 方法检索或设置。在创建 MemoryStream 的新实例时,当前位置设置为零。
用无符号字节数组创建的内存流提供无法调整大小的数据流视图,而且只能向其写入。当使用字节数组时,虽然根据传递到构造函数中的参数可能能够修改现有内容,但既不能追加也不能收缩流。空内存流是可调整大小的,而且可以向其写入和从中读取。
如果将 MemoryStream 对象添加到 ResX 文件或 .resources 文件中,则可在运行时调用 GetStream 方法对其进行检索。
如果将 MemoryStream 对象序列化为资源文件,它将被实际序列化为 UnmanagedMemoryStream。此行为可以提供更好的性能,并可以提供将指针直接指向数据的功能,而不必使用 Stream 方法。

【MemoryStream 类 - 常用属性、方法】
常用方法
  • BeginRead
    开始异步读操作。
  • BeginWrite
    开始异步写操作。
  • Close
    关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
  • EndRead
    等待挂起的异步读取完成。
  • EndWrite
    结束异步写操作。
  • Read
    从当前流中读取字节块并将数据写入 buffer 中。
  • ReadByte
    从当前流中读取一个字节。
  • Write
    使用从缓冲区读取的数据将字节块写入当前流。
  • WriteByte
    将一个字节写入当前流中的当前位置。
  • WriteTo
    将此内存流的整个内容写入另一个流中。
常用属性
  • Capacity
    获取或设置分配给该流的字节数。
  • Length
    获取用字节表示的流长度。

【BufferedStream 类】给另一流上的读写操作添加一个缓冲层。无法继承此类。
缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。缓冲区可提高读取和写入性能。使用缓冲区可进行读取或写入,但不能同时进行这两种操作。BufferedStream 的 Read 和 Write 方法自动维护缓冲区。
BufferedStream 可写在某些类型的流周围。它提供从基础数据源或储存库读取字节以及将字节写入基础数据源或储存库的实现。使用 BinaryReader 和 BinaryWriter 读取和写入其他数据类型。BufferedStream 用于在不需要缓冲区时防止缓冲区降低输入和输出速度。如果您读取和写入的大小始终大于内部缓冲区的大小,那么 BufferedStream 可能甚至无法分配内部缓冲区。BufferedStream 也在共享缓冲区中缓冲读取和写入。

两个重载的构造方法
public BufferedStream(Stream stName);
// 构造函数类型1
public BufferedStream(Stream stName, int bSize);
// 构造函数类型2

using System;
using System.IO;

public class Trial{
     public static void Main(){
          MemoryStream memstr = new MemoryStream();
          BufferedStream buffstr = new BufferedStream(memstr);
          buffstr.WriteByte((byte)100);
          buffstr.Position = 0;
          byte[] arrb = {1, 2, 3};
          buffstr.Read(arrb, 0, 2);

          for(int i = 0; i < 3; i++){
               Console.WriteLine("val {0}", arrb[i]);
          }
          Console.WriteLine("ReadByte()的返回值为{0}", buffstr.ReadByte());
     }
}

【BufferedStream类 - 常用属性、方法】
常用方法
  • BeginRead
    开始异步读操作。
  • BeginWrite
    开始异步写操作。
  • Close
    关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
  • EndRead
    等待挂起的异步读取完成。
  • EndWrite
    结束异步写操作。
  • Flush
    清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。
  • Read
    将字节从当前缓冲流复制到数组。
  • ReadByte
    从基础流中读取一个字节,并返回转换为 int 的该字节;或者如果从流的末尾读取则返回 -1。
  • Write
    将字节复制到缓冲流,并将缓冲流内的当前位置前进写入的字节数。
  • WriteByte
    将一个字节写入缓冲流的当前位置。
常用属性
  • Length
    获取用字节表示的流长度。

【FileStream 类】公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。
FileStream 对象支持使用 Seek 方法对文件进行随机访问。Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由 SeekOrigin 类的三个属性表示。
虽然同步方法 Read 和 Write 以及异步方法 BeginRead、BeginWrite、EndRead 和 EndWrite 在同步或异步模式下都可以工作,但模式会影响这些方法的性能。FileStream 默认情况下以同步方式打开文件,但提供 FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) 构造函数以异步方式打开文件。
如果进程因文件的一部分锁定而终止或者关闭具有未解除锁定的文件,则行为是未定义的。
请确保对所有 FileStream 对象调用 Dispose 方法,特别是在磁盘空间有限的环境中。如果没有可用的磁盘空间并且在终止 FileStream 之前没有调用 Dispose 方法,则执行 IO 操作会引发异常。

【FileStream类 - 常用构造方法】
  • FileStream(String, FileMode)
    使用指定的路径和创建模式初始化 FileStream 类的新实例。
  • FileStream(String, FileMode, FileAccess)
    使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。
  • FileStream(String, FileMode, FileAccess, FileShare)
    使用指定的路径、创建模式、读/写权限和共享权限创建 FileStream 类的新实例。

【FileStream类 - 常用属性、方法】
常用方法
  • BeginRead
    开始异步读。
  • BeginWrite
    开始异步写。
  • Close
    关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。
  • EndRead
    等待挂起的异步读取完成。
  • EndWrite
    结束异步写入,在 I/O 操作完成之前一直阻止。
  • Flush
    清除该流的所有缓冲区会使得所有缓冲的数据都将写入到文件系统。
  • Read
    从流中读取字节块并将该数据写入给定缓冲区中。
  • ReadByte
    从文件中读取一个字节,并将读取位置提升一个字节。
  • Write
    使用从缓冲区读取的数据将字节块写入该流。
  • WriteByte
    将一个字节写入文件流的当前位置。
常用属性
  • Length
    获取用字节表示的流长度。

【FileMode 枚举数】指定操作系统打开文件的方式。
  • Append
    打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。试图查找文件尾之前的位置时会引发 IOException,并且任何试图读取的操作都会失败并引发 NotSupportedException。
  • 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,则需要 FileIOPermissionAccess.Write。如果用 FileAccess.ReadWrite 打开文件,则同时需要 FileIOPermissionAccess.Read 和 FileIOPermissionAccess.Write。 如果文件访问为 FileAccess.Append,则需要 FileIOPermissionAccess.Append。
  • Truncate
    指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。此操作需要 FileIOPermissionAccess.Write。试图从使用 Truncate 打开的文件中进行读取将导致异常。

【FileAccess 枚举数】定义用于控制对文件的读访问、写访问或读/写访问的常数。
  • Read
    对文件的读访问。可从文件中读取数据。同 Write 组合即构成读写访问权。
  • Write
    文件的写访问。可将数据写入文件。同 Read 组合即构成读/写访问权。
  • ReadWrite
    对文件的读访问和写访问。可从文件读取数据和将数据写入文件。

【FileShare 枚举数】包含用于控制其他 FileStream 对象对同一文件可以具有的访问类型的常数。
  • None
    谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
  • Read
    允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
  • Write
    允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
  • ReadWrite
    允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。
  • Delete
    允许随后删除文件。

【FileStream 类示例】
using System;
using System.IO;

public class ExStream{
     public static void Main(){
          Console.WriteLine("请为文件输入一个名称:");
          string Filename = Console.ReadLine();
          FileStream filestr = new FileStream(Filename, FileMode.OpenOrCreate);

          BinaryWriter binwrt = new BinaryWriter(filestr);

          for(int i = 0; i < 20; i++){
               binwrt.Write((int)i);
          }
          binwrt.Close();
          filestr.Close();

          filestr = new FileStream(Filename, FileMode.Open, FileAccess.Read);
          BinaryReader binread = new BinaryReader(filestr);

          for(int i = 0; i < 20; i++){
               Console.WriteLine(binread.ReadInt32());
               binwrt.Close();
          }
     }
}
创建了 FileStream 类的一个实例,以构造具有用户指定的名称的文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晚回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值