文件和流 I/O(输入/输出)是指将数据传输到存储介质或从存储介质传输数据。 在 .NET 中 System.IO
,命名空间包含用于在数据流和文件中以同步和异步方式读取和写入的类型。 这些命名空间还包含对文件执行压缩和解压缩的类型,以及支持通过管道和串行端口进行通信的类型。
文件是具有持久性存储的已排序和命名字节集合。 处理文件时,可以使用目录路径、磁盘存储和文件和目录名称。 相反,流是一个字节序列,可用于对后备存储进行读取和写入操作,后备存储可以是多个存储媒介之一(例如,磁盘或内存)。 与磁盘以外的多个后盾存储一样,除了文件流之外,还有多种流,例如网络、内存和管道流。
文件和目录
可以使用命名空间中的 System.IO 类型与文件和目录进行交互。 例如,可以获取和设置文件和目录的属性,并根据搜索条件检索文件和目录的集合。
有关路径命名约定和表达 Windows 系统文件路径的方法,包括 .NET Core 1.1 及更高版本中支持的 DOS 设备语法以及 .NET Framework 4.6.2 及更高版本,请参阅 Windows 系统上的文件路径格式。
下面是一些常用的文件和目录类:
File - 提供用于创建、复制、删除、移动和打开文件的静态方法,并帮助创建对象 FileStream 。
FileInfo - 提供用于创建、复制、删除、移动和打开文件的实例方法,并帮助创建对象 FileStream 。
Directory - 提供用于创建、移动和枚举目录和子目录的静态方法。
DirectoryInfo - 提供用于创建、移动和枚举目录和子目录的实例方法。
Path - 提供用于以跨平台方式处理目录字符串的方法和属性。
调用文件系统方法时,应始终提供可靠的异常处理。 有关详细信息,请参阅 处理 I/O 错误。
除了使用这些类,Visual Basic 用户还可以使用类为 Microsoft.VisualBasic.FileIO.FileSystem 文件 I/O 提供的方法和属性。
请参阅 如何:复制目录、 如何:创建目录列表以及如何 :枚举目录和文件。
溪流
抽象基类 Stream 支持读取和写入字节。 表示流的所有类都继承自 Stream 该类。 该 Stream 类及其派生类提供数据源和存储库的常见视图,并将程序员与作系统和基础设备的特定详细信息隔离开来。
流涉及三个基本操作:
读取 - 将数据从流传输到数据结构,例如字节数组。
写入 - 将数据从数据源传输到流。
查找 - 查询和修改流中的当前位置。
流可能仅支持其中一些功能,具体取决于基础数据源或存储库。 例如,该 PipeStream 类不支持查找。 流的CanRead、CanWrite和CanSeek属性指定流支持的操作。
下面是一些常用的流类:
FileStream – 用于读取和写入文件。
IsolatedStorageFileStream – 用于在独立存储中读取和写入文件。
MemoryStream - 用于作为后备存储对内存进行读取和写入操作。
BufferedStream – 用于提高读取和写入作的性能。
NetworkStream - 用于通过网络套接字进行读取和写入。
PipeStream - 用于通过匿名和命名管道进行读取和写入。
CryptoStream – 用于将数据流链接到加密转换。
有关异步处理流的示例,请参阅 异步文件 I/O。
读者和编写者
命名空间 System.IO 还提供用于从流读取编码字符并将其写入流的类型。 通常,流用于字节输入和输出。 读取器和写入器类型负责处理编码字符与字节之间的转换,以便流可以完成操作。 每个读取器和编写器类都与一个流相关联,该流可以通过类的属性 BaseStream
进行检索。
下面是一些常用的读取器和编写器类:
BinaryReader 以及 BinaryWriter – 用于读取和写入基元数据类型作为二进制值。
StreamReader 和 StreamWriter - 用于通过使用编码值在字符和字节之间来回转换来读取和写入字符。
StringReader 以及 StringWriter – 用于读取和写入字符串中的字符。
TextReader 和 TextWriter – 用作读取和写入字符和字符串的其他读取器和编写器的抽象基类,但不能用作二进制数据。
请参阅 作方法:从文件读取文本、 如何:将文本写入文件、 如何:读取字符串中的字符,以及如何 :将字符写入字符串。
异步输入/输出操作
读取或写入大量数据可能会占用大量资源。 如果应用程序需要保持对用户的响应,则应异步执行这些任务。 在进行同步 I/O 操作时,UI 线程会被阻塞,直到资源密集型操作完成。 在开发 Windows 8.x 应用商店的应用程序时使用异步 I/O操作,以防止造成应用已停止工作的印象。
异步成员在其名称中包含Async
,例如CopyToAsync、FlushAsync和ReadAsyncWriteAsync方法。 你用async
和await
关键字使用这些方法。
有关详细信息,请参阅 异步文件 I/O。
压缩
压缩是指减小存储文件的大小的过程。 解压缩是将压缩文件中的内容提取为可用格式的过程。 命名空间 System.IO.Compression 包含用于压缩和解压缩文件和流的类型。
压缩和解压缩文件和流时,经常使用以下类:
ZipArchive – 用于在 zip 存档中创建和检索条目。
ZipArchiveEntry – 表示压缩的文件。
ZipFile – 用于创建、提取和打开压缩包。
ZipFileExtensions – 用于在压缩包中创建和提取条目。
DeflateStream – 用于使用 Deflate 算法压缩和解压缩流。
GZipStream – 用于压缩和解压缩 gzip 数据格式的流。
请参阅 如何:压缩和提取文件。
独立存储
独立存储是一种数据存储机制,它通过定义将代码与已保存数据关联的标准化方法来提供隔离和安全。 存储提供由用户、程序集和(可选)域隔离的虚拟文件系统。 当应用程序无权访问用户文件时,隔离存储特别有用。 你可以以受计算机安全策略控制的方式保存应用程序的设置或文件。
独立存储不适用于 Windows 8.x 应用商店应用;而是在命名空间中使用 Windows.Storage 应用程序数据类。 有关详细信息,请参阅 应用程序数据。
实现独立存储时,经常使用以下类:
IsolatedStorage – 为独立存储实现提供基类。
IsolatedStorageFile – 提供包含文件和目录的独立存储区域。
IsolatedStorageFileStream - 公开独立存储中的文件。
请参阅 独立存储。
Windows 应用商店应用中的 I/O 操作
适用于 Windows 8.x 应用商店应用的 .NET 包含许多用于读取和写入流的类型;但是,此集不包括所有 .NET I/O 类型。
在 Windows 8.x 应用商店应用中使用 I/O作时需要注意的一些重要差异:
与文件操作(例如File、FileInfo、Directory和DirectoryInfo)相关的类型不包括在适用于 Windows 8.x 商店应用程序的 .NET 中。 请改用 Windows 运行时命名空间中的 Windows.Storage 类型,例如 StorageFile 和 StorageFolder。
独立存储不可用;请改用 应用程序数据。
使用异步方法(例如 ReadAsync 和 WriteAsync)防止阻止 UI 线程。
基于路径的压缩类型 ZipFile , ZipFileExtensions 不可用。 请改用命名空间中的 Windows.Storage.Compression 类型。
如有必要,可以在 .NET Framework 流和 Windows 运行时流之间进行转换。 有关详细信息,请参阅如何在 .NET Framework 流和 Windows 运行时流之间进行转换或WindowsRuntimeStreamExtensions。
有关 Windows 8.x 应用商店应用中的 I/O作的详细信息,请参阅 快速入门:读取和写入文件。
I/O 和安全性
使用命名空间中的 System.IO 类时,必须遵循操作系统安全要求(如访问控制列表(ACL))来控制对文件和目录的访问。 此要求是在所有 FileIOPermission 要求之外的要求。 你可以以编程方式管理 ACL。 有关详细信息,请参阅 “如何:添加或删除访问控制列表条目”。
默认安全策略阻止 Internet 或 Intranet 应用程序访问用户计算机上的文件。 因此,在编写将通过 Internet 或 Intranet 下载的代码时,不要使用需要物理文件路径的 I/O 类。 而是对 .NET 应用程序使用 独立存储 。
仅在构造流时执行安全性检查。 因此,不要打开流,然后将其传递给不太受信任的代码或应用程序域。
相关主题
常见 I/O 任务
提供与文件、目录和流关联的 I/O 任务列表,以及指向每个任务的相关内容和示例的链接。异步文件输入/输出 (I/O)
介绍异步 I/O 的性能优势和基本操作。独立存储
描述一种数据存储机制,该机制通过定义将代码与保存的数据关联的标准化方法来提供隔离和安全性。管道
描述 .NET 中的匿名和命名管道操作。内存映射文件
描述内存映射文件,其中包含虚拟内存中磁盘上文件的内容。 可以使用内存映射文件编辑非常大的文件,并创建共享内存进行进程间通信。