文件操作的知识点(10月2日修改)
System.IO命名空间包含允许读写文件和数据流的类及提供基本文件和目录支持的类。
部分类及说明
BinaryReader 用特定的编码将基元数据类型读作二进制值。
BinaryWriter 以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。
BufferedStream 给另一流上的读写操作添加一个缓冲层。无法继承此类。
Directory 公开用于创建、移动和枚举通过目录和子目录的静态方法。无法继承此类。
File 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
FileStream 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
Stream 提供字节序列的一般视图。
一、File类
(一)概述
将 File 类用于典型的操作,如复制、移动、重命名、创建、打开、删除和追加到文件。也可将 File 类用于获取和设置文件属性或有关文件创建、访问及写入操作的 DateTime
信息。
许多 File 方法在您创建或打开文件时返回其他 I/O 类型。可以使用这些其他类型进一步操作文件。有关更多信息,请参见特定的 File 成员,如 OpenText、CreateText 或
Create。
由于所有的 File 方法都是静态的,所以如果只想执行一个操作,那么使用 File 方法的效率比使用相应的 FileInfo 实例方法可能更高。所有的 File 方法都要求当前所操作的
文件的路径。
File 类的静态方法对所有方法都执行安全检查。如果打算多次重用某个对象,可考虑改用 FileInfo 的相应实例方法,因为并不总是需要安全检查。
默认情况下,将向所有用户授予对新文件的完全读/写访问权限。
在接受路径的成员中,路径可以是指文件或仅是目录。指定路径也可以是相对路径或者服务器和共享名称的统一命名约定 (UNC) 路径。例如,以下都是可接受的路径:
C# 中的“c:\\MyDir\\MyFile.txt”或 Visual Basic 中的“c:\MyDir\MyFile.txt”。
C# 中的“c:\\MyDir”或 Visual Basic 中的“c:\MyDir”。
C# 中的“MyDir\\MySubdir”或 Visual Basic 中的“MyDir\MySubDir”。
C# 中的“\\\\MyServer\\MyShare”或 Visual Basic 中的“\\MyServer\MyShare”。
(二)File类的方法
File类提供了执行这些操作的静态方法
1、AppendAllText 已重载。 将指定的字符串追加到文件中,如果文件还不存在则创建该文件。
File.AppendAllText (String, String) 打开一个文件,向其中追加指定的字符串,然后关闭该文件。如果文件不存在,此方法创建一个文件,将指定的字符串写入文件,然后关
闭该文件。
public static void AppendAllText (
string path,
string contents
)
2、AppendText 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件。
public static StreamWriter AppendText (
string path
)
3、Copy 已重载。 将现有文件复制到新文件。
File.Copy (String, String) 将现有文件复制到新文件。不允许改写同名的文件。
public static void Copy (
string sourceFileName,
string destFileName
)
File.Copy (String, String, Boolean) 将现有文件复制到新文件。允许改写同名的文件。
public static void Copy (
string sourceFileName,
string destFileName,
bool overwrite
)
参数
sourceFileName
要复制的文件。
destFileName
目标文件的名称。不能是目录。
overwrite
如果可以改写目标文件,则为 true;否则为 false。
4、Create 已重载。 在指定路径中创建文件。
File.Create (String) 在指定路径中创建文件。
public static FileStream Create (
string path
)
File.Create (String, Int32) 创建或改写指定的文件。
public static FileStream Create (
string path,
int bufferSize
)
参数
path
文件名。
bufferSize
用于读取和写入文件的已放入缓冲区的字节数。
返回值
一个具有指定缓冲大小的 FileStream,它提供对 path 中指定的文件的读/写访问。
5、Delete 删除指定的文件。如果指定的文件不存在,则不引发异常。
public static void Delete (
string path
)
6、Exists 确定指定的文件是否存在。
public static bool Exists (
string path
)
7、GetAttributes 获取在此路径上的文件的 FileAttributes。
public static FileAttributes GetAttributes (
string path
)
8、Move 将指定文件移到新位置,并提供指定新文件名的选项。
public static void Move (
string sourceFileName,
string destFileName
)
9、Open 已重载。 打开指定路径上的 FileStream。
File.Open (String, FileMode) 打开指定路径上的 FileStream,具有读/写访问权限。
public static FileStream Open (
string path,
FileMode mode
)
File.Open (String, FileMode, FileAccess) 以指定的模式和访问权限打开指定路径上的 FileStream。
public static FileStream Open (
string path,
FileMode mode,
FileAccess access
)
File.Open (String, FileMode, FileAccess, FileShare) 打开指定路径上的 FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项。
public static FileStream Open (
string path,
FileMode mode,
FileAccess access,
FileShare share
)
参数
path
要打开的文件。
mode
FileMode 值,用于指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容。
access
FileAccess 值,指定可以对文件执行的操作。
share
FileShare 值,它指定其他线程所具有的对该文件的访问类型。
返回值
以指定模式打开的指定路径上的 FileStream,具有读/写访问权限并且不共享。
10、OpenRead 打开现有文件以进行读取。
public static FileStream OpenRead (
string path
)
11、OpenText 打开现有 UTF-8 编码文本文件以进行读取。
public static StreamReader OpenText (
string path
)
知识扩充:
编码是一个将一组 Unicode 字符转换为一个字节序列的过程。解码是一个反向操作过程,即将一个编码字节序列转换为一组 Unicode 字符。
Unicode 标准为所有支持脚本中的每个字符分配一个码位(一个数字)。Unicode 转换格式 (UTF) 是一种码位编码方式。Unicode 标准 3.2 版使用下列 UTF:
UTF-8,它将每个码位表示为一个由 1 至 4 个字节组成的序列。
UTF-16,它将每个码位表示为一个由 1 至 2 个 16 位整数组成的序列。
UTF-32,它将每个码位表示为一个 32 位整数。
GetByteCount 方法确定将有多少字节导致对 Unicode 字符集进行编码,而 GetBytes 方法将执行实际的编码操作。
同样,GetCharCount 方法确定有多少字符导致对字节序列进行解码,而 GetChars 和 GetString 方法执行实际的解码。
或者,UTF8Encoding 提供一个前导码(即一个字节数组),可以将它作为编码过程中所产生的字节序列的前缀。如果前导码中包含字节顺序标记(码位为 U+FEFF),则它会帮助
解码器确定字节顺序和转换格式或 UTF。Unicode 字节顺序标记被序列化为 EF BB BF(十六进制)。GetPreamble 方法返回一个包含字节顺序标记的字节数组。
有关 Unicode 编码、字节顺序和字节顺序标记的更多信息,请参见 www.unicode.org 上的“The Unicode Standard”(Unicode 标准)部分。
12、OpenWrite 打开现有文件以进行写入。
public static FileStream OpenWrite (
string path
)
二、FileStream类
(一)概述
FileStream类可用于执行文件的读写操作,其中Read()和Write()方法用于同步读写操作,BeginRead()和BeginWrite()方法用于异步读写操作。同步读写时,其他活动都将停止,
所以读写较大文件或通过网络进行读写时,最好使用异步读写方式。
FileStream类默认的读写方式为同步,但也提供了异步读写文件的构造函数。
FileStream (String, FileMode) 使用指定的路径和创建模式初始化 FileStream 类的新实例。
public FileStream (
string path,
FileMode mode
)
FileStream (String, FileMode, FileAccess) 使用指定的路径、创建模式和读/写权限初始化 FileStream 类的新实例。
public FileStream (
string path,
FileMode mode,
FileAccess access
FileStream (String, FileMode, FileAccess, FileShare) 使用指定的路径、创建模式、读/写权限和共享权限创建 FileStream 类的新实例。
public FileStream (
string path,
FileMode mode,
FileAccess access,
FileShare share
)
参数
path
当前 FileStream 对象将封装的文件的相对路径或绝对路径。
mode
FileMode 常数,确定如何打开或创建文件。
access
FileAccess 常数,它确定 FileStream 对象访问文件的方式。这将获取 FileStream 对象的 CanRead 和 CanWrite 属性。如果 path 指定磁盘文件,则 CanSeek 为 true。
share
FileShare 常数,确定文件如何由进程共享。 指定其他FileStream对象对该文件可以具有的访问类型
**********************************************************************
FileStream 构造函数 (String, FileMode, FileAccess, FileShare, Int32, Boolean) 异步读写时要用到这个构造函数
使用指定的路径、创建模式、读/写和共享权限、缓冲区大小和同步或异步状态初始化 FileStream 类的新实例。
参数
path
当前 FileStream 对象将封装的文件的相对路径或绝对路径。
mode
FileMode 常数,确定如何打开或创建文件。
access
FileAccess 常数,它确定 FileStream 对象访问文件的方式。这将获取 FileStream 对象的 CanRead 和 CanWrite 属性。如果 path 指定磁盘文件,则 CanSeek 为 true。
share
FileShare 常数,确定文件如何由进程共享。
bufferSize
一个大于零的正 Int32 值,表示缓冲区大小。对于 0 和 8 之间的 bufferSize 值,缓冲区的实际大小设置为 8 字节。
useAsync
指定使用异步 I/O 还是同步 I/O。但是,请注意,基础操作系统可能不支持异步 I/O,因此在指定 true 后,根据所用平台,句柄可能同步打开。当异步打开时,BeginRead 和
BeginWrite 方法在执行大量读或写时效果更好,但对于少量的读/写,这些方法速度可能要慢得多。如果应用程序打算利用异步 I/O,将 useAsync 参数设置为 true。正确使用异
步 I/O,可以使应用程序的速度加快 10 倍,但是如果在没有为异步 I/O 重新设计应用程序的情况下使用异步 I/O,则可能使性能降低 10 倍。
(二)FileMode 枚举 的成员 指定打开操作系统文件的方式
Append 打开现有文件并查找到文件尾,或创建新文件。FileMode.Append 只能同 FileAccess.Write 一起使用。
Create 指定操作系统应创建新文件。如果文件已存在,它将被改写。
CreateNew 指定操作系统应创建新文件。 如果文件已存在,则将引发异常
Open 指定操作系统应打开现有文件。打开文件的能力取决于 FileAccess 所指定的值。如果该文件不存在,则引发异常。
OpenOrCreate 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。
Truncate 指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。试图从使用 Truncate 打开的文件中进行读取将导致异常。
(三)FileAccess 枚举 的成员
Read 对文件的读访问。可从文件中读取数据。同 Write 组合即构成读写访问权。
ReadWrite 对文件的读访问和写访问。可从文件读取数据和将数据写入文件。
Write 文件的写访问。可将数据写入文件。同 Read 组合即构成读/写访问权。
(四)FileShare 枚举 的成员
Delete 允许随后删除文件。
Inheritable 使文件句柄可由子进程继承。Win32 不直接支持此功能。
None 谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。
Read 允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍
可能需要附加权限才能够访问该文件。
ReadWrite 允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定
了此标志,仍可能需要附加权限才能够访问该文件。
Write 允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志
,仍可能需要附加权限才能够访问该文件。
(五)FileStream类的部分方法及说明
1、BeginRead 已重写。 开始异步读。
public override IAsyncResult BeginRead (
byte[] array,
int offset,
int numBytes,
AsyncCallback userCallback,
Object stateObject
)
参数
array
要读入数据的缓冲区。
offset
array 中的字节偏移量,从此处开始读取。
numBytes
最多读取的字节数。
userCallback
异步读操作完成后调用的方法。
stateObject
一个用户提供的对象,它将该特定的异步读取请求与其他请求区别开来。
返回值
引用异步读的 IAsyncResult。
备注
每次调用 BeginRead 时都必须调用 EndRead。无法结束一个读取进程就开始另一个读取可能导致死锁等不希望出现的行为。
FileStream 提供了两种不同的操作模式:同步 I/O 和异步 I/O。虽然这两种模式都可以使用,但基础操作系统资源可能只允许以其中一种模式进行访问。默认情况下,
FileStream 同步打开操作系统句柄。在 Windows 中,这将降低异步方法的速度。如果使用异步方法,请使用 FileStream 构造函数。
2、BeginWrite 已重写。 开始异步写。
public override IAsyncResult BeginWrite (
byte[] array,
int offset,
int numBytes,
AsyncCallback userCallback,
Object stateObject
)
参数
array
包含要写入当前流的数据的缓冲区。
offset
array 中的从零开始的字节偏移量,从此处开始将字节复制到当前流。
numBytes
最多写入的字节数。
userCallback
异步写操作完成后调用的方法。
stateObject
一个用户提供的对象,它将该特定的异步写入请求与其他请求区别开来。
备注
对于 BeginWrite 中的每个 IAsyncResult,必须正好调用一次 EndWrite。EndWrite 将一直阻止到完成 I/O 操作为止。
此方法重写 BeginWrite。
FileStream 提供了两种不同的操作模式:同步 I/O 和异步 I/O。虽然这两种模式都可以使用,但基础操作系统资源可能只允许以其中一种模式进行访问。默认情况下,
FileStream 同步打开操作系统句柄。在 Windows 中,这将降低异步方法的速度。如果使用异步方法,请使用 FileStream 构造函数。
如果流已关闭或者传递了无效的参数,将立即从 BeginWrite 中引发异常。在异步写入请求过程中出现的错误(例如 IO 请求过程中的磁盘失败)会在线程池线程上发生,并且在
调用 EndWrite 变为可见。
3、Close 关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 (从 Stream 继承。)
public virtual void Close ()
4、EndRead 已重写。 等待挂起的异步读取完成。
5、EndWrite 已重写。 结束异步写入,在 I/O 操作完成之前一直阻止。
6、Flush 已重写。 清除该流的所有缓冲区,使得所有缓冲的数据都被写入到基础设备。
public override void Flush ()
7、Lock 允许读取访问的同时防止其他进程更改 FileStream。
public virtual void Lock (
long position,
long length
)
8、Read 已重写。 从流中读取字节块并将该数据写入给定缓冲区中。
public override int Read (
[InAttribute] [OutAttribute] byte[] array,
int offset,
int count
)
参数
array
当此方法返回时,包含指定的字节数组,数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节替换。
offset
array 中的字节偏移量,从此处开始读取。
count
最多读取的字节数。
返回值
读入 buffer 中的总字节数。如果当前的字节数没有所请求那么多,则总字节数可能小于所请求的字节数;或者如果已到达流的末尾,则为零。
9、Write 已重写。 使用从缓冲区读取的数据将字节块写入该流。
public override void Write (
byte[] array,
int offset,
int count
)
10、WriteByte 已重写。 将一个字节写入文件流的当前位置。
public override void WriteByte (
byte value
)
知识扩充:
System.Text.UTF8Encoding
UTF8Encoding (Boolean) 初始化 UTF8Encoding 类的新实例。参数指定是否提供一个 Unicode 字节顺序标记。
public UTF8Encoding (
bool encoderShouldEmitUTF8Identifier
)
参数
encoderShouldEmitUTF8Identifier
如果为 true,则指定提供 Unicode 字节顺序标记;否则为 false。
GetBytes 已重载。 将一组字符编码为一个字节序列。
UTF8Encoding.GetBytes (Char[]) 在派生类中重写时,将指定字符数组中的所有字符编码为一个字节序列。
UTF8Encoding.GetBytes (String) 在派生类中重写时,将指定的 String 中的所有字符编码为一个字节序列。
UTF8Encoding.GetBytes (Char[], Int32, Int32) 在派生类中重写时,将指定字符数组中的一组字符编码为一个字节序列。
UTF8Encoding.GetBytes (Char*, Int32, Byte*, Int32) 将从指定的字符指针开始的一组字符编码为一个字节序列,并从指定的字节指针开始存储该字节序列。
UTF8Encoding.GetBytes (Char[], Int32, Int32, Byte[], Int32) 将指定字符数组中的一组字符编码到指定的字节数组中。
UTF8Encoding.GetBytes (String, Int32, Int32, Byte[], Int32) 将指定 String 中的一组字符编码到指定的字节数组中。
GetString 已重载。 将一个字节序列解码为一个字符串。
UTF8Encoding.GetString (Byte[]) 在派生类中重写时,将指定字节数组中的所有字节解码为一个字符串。
UTF8Encoding.GetString (Byte[], Int32, Int32) 将字节数组中某个范围的字节解码为一个字符串。