程序设计全套11文件和流.ppt_第1页
程序设计全套11文件和流.ppt_第2页
程序设计全套11文件和流.ppt_第3页
程序设计全套11文件和流.ppt_第4页
程序设计全套11文件和流.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章文件和流 内容简介 C 语言采用C 和Java语言中流的概念 来处理输入 输出方面的问题 但是使用起来要简单的多 本章介绍C 语言中 如何处理目录和文件夹 如何处理文件 如何使用流的概念读写文件 目录 11 1文件和流的概念 11 2对话框 11 3多文档操作 本章小结 C 语言具有平台无关性 不允许程序直接访问I O设备 对包括文件在内的设备的I O操作是以流的形式实现的 流是进行数据读写操作的基本对象 通过流的概念 程序员可以把输入和输出的数据看作是一个字节序列的数据流 而不必关心具体设备的特定细节 NET中基于流的I O操作方式 大大简化了开发人员的工作 在C 中 有两种类型的流 文本流 textstream 和二进制流 binarystream 1 文本流 文本流是指在流中流动的数据是以字符的形式出现的 流中的每一个字符对应一个字节 用于存放对应的ASCII码值 因此文本流中的数据可以显示和打印出来 都是用户可以读懂的信息 11 1文件和流的概念 2 二进制流 二进制流中的数据是按照二进制编码的方式来存放文件的 二进制数据也可在屏幕上显示 但其内容无法读懂 二进制流是由与外部设备中的内容一一对应的一系列字节组成的 使用二进制流时没有字符翻译过程 而且所读写的字节数也与外部设备中的相同 在 NET框架中 所有的输入和输出操作都要用到流 在System IO命名空间中 包含了绝大部分与I O操作相关的类 下面将重点介绍与文件管理和操作相关的类 以及如何利用它们来实现文件的读写 11 1文件和流的概念 11 2文件的存储管理 NET框架所提供的文件系统操作的类大多位于System IO命名空间中 常用的类有DriveInfo Directory DirectoryInfo Path File FileInfo等 通过这些类可以浏览文件系统和执行相关操作 如移动 复制和删除文件 11 2 1DriveInfo类 NET框架提供了DriveInfo类和DriveType枚举类型 以便于在程序中直接使用驱动器 DriveInfo类提供了访问有关驱动器的信息的实例方法 使用DriveInfo类 可以确定有关驱动器的信息 包括驱动器盘符 驱动器类型 驱动器上的可空间等用 DriveType枚举类型定义了驱动器类型常数 使用DriveType枚举类型 可以辅助确定DriveInfo类实例的驱动器类型 DriveInfo类的常用属性成员如表13 1所示 见教材 常用的方法成员是GetDrives 用于检索计算机上的所有逻辑驱动器的驱动器名称 并返回DriveInfo类型的数组 DriveType枚举型的枚举值有7个 CDRom 光驱 Fixed 固定磁盘 即硬盘 Network 网络驱动器 NoRootDirectory 没有根目录的驱动器 Ram RAM磁盘 如内存 Removable 可移动设备 如软盘 U盘 和Unknown 未知类型的驱动器 例如 要输出NTFS格式的硬盘驱动器的可用空闲空间大小 可编写代码如下 11 2 1DriveInfo类 DriveInfo drivers DriveInfo GetDrives foreach DriveInfodrindrivers if dr DriveType DriveType Fixed 11 2 1DriveInfo类 Directory和DirectoryInfo类是 NET框架提供的用于目录管理的类 每个驱动器都有一个根目录 使用 表示 Directory和DirectoryInfo类的功能非常相似 利用它们 可以完成对目录及其子目录的创建 移动 删除等操作 甚至还可以定义隐藏目录和只读目录 二者的区别在于 Directory类是一个静态类 其中提供的是静态方法 不能使用new关键字创建其对象 DirectoryInfo类是一个需要实例化的类 该类的实例对象表示计算机上的某一目录 Directory类的常用静态方法如表13 2所示 见教材 11 2 2Directory和DirectoryInfo类 11 2 2Directory和DirectoryInfo类 DirectoryInfo类的属性成员有Name 目录名称 Exists 指示目录是否存在 Parent 父目录 Root 根目录 常用的方法成员有Create 创建目录 CreateSubDirectory 创建子目录 Delete 删除目录 GetDirectories 获取当前目录的子目录 GetFiles 获取当前目录的文件列表 MoveTo 移动目录 等 由于Directory类的所有方法都是静态的 如果只想执行一个目录操作 使用Directory静态方法的效率比使用相应的DirectoryInfo实例方法更高 大多数Directory方法要求给出当前操作目录的路径 且Directory类的静态方法都执行安全检查 但是 如果打算多次重用某个目录对象 可考虑使用DirectoryInfo的相应实例方法 因为它并不总是需要安全检查 11 2 2Directory和DirectoryInfo类 NET框架提供了Path类 以便于在程序中管理文件和目录路径 所谓路径 就是文件或目录所在的位置 要检索某个文件 必须首先确定该文件的路径 路径由驱动器盘符 目录名 文件名 文件扩展名和分隔符组成 有两种表示方法 一种是从驱动器的根目录开始书写 例如C Windows System32 notepad exe 这种路径称为绝对路径 另一种是从当前目录位置开始书写 例如System32 notepad exe 假设当前目录为C Windows 这种路径称为相对路径 11 2 3Path类 使用路径时要注意 C 将反斜杠 作为转义符 因此 当路径表示为字符串时 要使用两个反斜杠表示 例如 C Windows System32 notepad exe C 还允许在字符串前添加 标志 以提示编译器不要把 字符视作转义符 而是视作普通字符 例如 C Windows System32 notepad exe 11 2 3Path类 Path类是一个静态类 可以用来操作路径的各个部分 如驱动器盘符 目录名 文件名 文件扩展名和分隔符等 Path类的常用属性成员有DirectorySeparatorChar 目录分隔符 PathSeparator 路径分隔符 VolumeSeparatorChar 卷分隔符 等 常用的方法成员有GetDirecotryName 获取目录名 GetExtension 获取文件扩展名 GetFileName 获取文件名 GetFullPath 获取完整路径 HasExtension 确定路径是否包括文件扩展名 等 11 2 3Path类 11 2 3Path类 例如 要输出路径C Windows System32 notepad exe中的目录名和文件名 可编写代码如下 stringpath e Windows System32 notepad exe Console WriteLine Path GetDirectoryName path Console WriteLine Path GetFileName path 上述代码中 目录名为 C Windows System32 文件名为 notepad exe 提示 Path类的大多数成员不与文件系统交互 并且不验证路径字符串指定的文件是否存在 但Path成员会验证指定路径字符串的内容 如果字符串包含无效的字符 则引发ArgumentException异常 File和FileInfo类是 NET框架提供的用于文件管理的类 它们在功能上非常相似 使用File和FileInfo类 可以完成对文件的创建 删除 复制 移动和打开等操作 也可以获取和设置文件的有关信息 还可以协助创建FileStream流对象 二者的区别在于 File类提供静态方法 而FileInfo类提供实例方法 11 2 4File和FileInfo类 1 File类File类是一个静态类 它通过一系列静态方法来提供对磁盘文件的操作功能 如创建 复制 删除 移动和打开文件 并协助创建FileStream对象 File类的主要方法成员有Create 创建新文件 Copy 复制文件 Delete 删除文件 Exists 判断文件是否存在 Move 移动文件 Open 打开文件 Replace 替换文件 AppendAllText 将指定的文本追加到文件中 如果文件不存在则创建该文件 等 11 2 4File和FileInfo类 11 2 4File和FileInfo类 1 File类例如 在C盘根目录下有一个名为 a txt 的文件 如果要对该文件进行复制 移动 替换和删除操作 可编写代码如下 File Copy C a txt C b txt 将a txt复制到b txtif File Exists D a txt 如果D盘的a txt存在File Replace C a txt D a txt 用C盘的a txt替换D盘的a txtelseFile Move C a txt D a txt 将a txt移动到D盘File Delete C b txt 删除b txt文件 11 2 4File和FileInfo类 1 File类提示 在表示文件路径名的字符串中 如果只写出文件名而不写出完整的路径名 那么默认目录就是当前程序可执行文件所在的目录 对于Windows应用程序 可通过Application类的静态属性StartupPath来获得程序可执行文件所在的目录路径 每个文件都有自己的属性信息 其中文件的创建时间 最近一次访问时间和最近一次修改间 可通过如下方法进行读写 11 2 4File和FileInfo类 1 File类 读取文件创建时间DateTimedt1 File GetCreationTime C a txt 设置文件创建时间File SetCreationTime C a txt dt1 AddDays 10 读取文件最近一次访问时间Console WriteLine File GetLastAccessTime C a txt 读取文件最近一次修改时间Console WriteLine File GetLastWriteTime C a txt File SetLastAccessTime C a txt dt1 设置文件访问时间File SetLastWriteTime C a txt dt1 设置文件修改时间 1 File类文件的其他属性信息则可通过File类的GetAttributes方法来获得 该方法返回一个FileAttributes枚举值 其枚举值包括Normal 普通文件 Archive 存档文件 ReadOnly 只读文件 Hidden 隐藏文件 Compressed 压缩文件 等 需要注意的是 一个文件的FileAttributes值可以是多个枚举值的 或 运算 例如 对于一个只读隐藏文件 GetAttributes方法返回的值将是FileAttributes ReadOnly FileAttributes Hidden 11 2 4File和FileInfo类 11 2 4File和FileInfo类 1 File类File类还可用于读写文件内容 其中ReadAllText方法用于将文件所有内容读取为一个字符串 而WriteAlIText方法则将字符串写入文件 例如 File WriteAllText C a txt 我爱北京天安门 Console WriteLine File ReadAllText C a txt 1 File类为了进一步方便文本读写 File类还提供了将文件各行依次读取到一个字符串数组的ReadAllLines方法 以及将字符串数组逐行写入文件的WriteAllLines方法 此外 File类的ReadAlIBytes方法可以将文件的所有字节读取到一个byte数组中 WriteAllBytes方法则将一个byte数组写入到文件中 11 2 4File和FileInfo类 11 2 4File和FileInfo类 2 FileInfo类与File类不同 FileInfo类仅可用于实例化的对象 如果使用同一个对象执行多个操作 使用FileInfo类就比较有效 因为在构造FileInfo类的对象时将读取合适文件的身份认证和其他信息 无论对每个对象调用了多少方法 都不需要再次读取这些信息 而File类在调用每个静态方法时 需要多次检查文件的内容 FileInfo类的主要方法成员有Create 创建新文件 CopyTo 复制文件 Delete 删除文件 MoveTo 移动文件 Open 打开文件 Replace 替换文件 等 11 2 4File和FileInfo类 2 FileInfo类例如 在C盘根目录下有一个名为 test txt 的文件 如果要将该文件复制到D盘 可编写代码如下 FileInfofile1 newFileInfo C test txt filel CopyTo D test txt 上述代码段与以下代码具有相同的效果 File Copy C test txt D test txt 第一个代码段执行的时间较长 因为需要实例化一个Filelnfo对象file1 但file1可以对同一个文件执行更多的操作 11 2 4File和FileInfo类 2 FileInfo类在实例化FileInfo类的过程中 如果表示文件的路径不存在 系统就会抛出一个异常 FileInfo类提供了Exists属性来确定文件路径是否存在 例如 FileInfofile1 newFileInfo C test txt Console WriteLine filel Exists ToString 上述代码中 如果系统中存在 C test txt 文件 那么将返回true 否则返回false 在确定了是否存在对应的文件之后 就可以使用许多属性来确定文件的信息 这些属性可以用来更新文件 11 3文件的操作 文件在操作时表现为流 NET中文件的输入输出都要用到流 流分为输入流和输出流 通常输入流用于读取数据 如键盘和鼠标 输出流用于向外部目标写数据 如显示器的屏幕 本章主要讨论的输入流和输出流仅限于磁盘文件 流支持以下三个基本操作 1 读取 read 表示把数据从流传输到某种数据结构中 例如把数据从流输出到byte数组中 2 写入 write 表示把数据从某种数据结构传输到流中 例如把byte数组中的数据传输到流中 3 定位 seek 表示在流中查询或重新定位当前位置 在 NET中 使用System IO命名空间中的抽象基类Stream来代表流 其他表示流的类都是从Stream类继承的 数据源可以是文本字符串 也可以是从网络或某个I O端口上的设备传来的数据原始字节 Stream类的派生类处理原始字节 TextReader和TextWriter类的派生类处理文本字符串 11 3文件的操作 11 3文件的操作 Stream类是流的抽象基类 定义了流的基本功能 该类定义了一些处理原始字节流的范型成员 其作用是将数据抽象为独立于底层数据设备的字节流 1 Stream类的常用属性根据I O设备的不同 不同的流可能只支持Stream类中定义的功能中的一部分 例如 NetworkStream 网络流 不支持定位 通过使用Stream类及其派生类的CanRead CanWrite CanSeek等属性 可以查询当前流所支持的操作 11 3 1Stream类 2 Stream类的常用方法Stream类提供了Read Write Seek等方法来支持流的基本操作 具体如下 1 publicvirtualvoidClose 功能 关闭当前流 并释放与之关联的所有资源 2 publicabstractvoidFlush 功能 清除当前流的所有缓冲区 并将所有缓冲数据写入到基础设备 11 3 1Stream类 2 Stream类的常用方法 3 publicabstractintRead byte buffer intoffset intcount 功能 从当前流中读取最多count个字节 用它们顺序替换字节数组buffer的offset到 offset count 1 之间的元素值 并将此流中的位置提升读取的字节数 最后返回读取的总字节数 如果当前可用的字节数没有请求的字节数那么多 则总字节数可能小于请求的字节数 如果当前已到达流的末尾 则为0 4 publicvirtualintReadByte 功能 从当前流中读取一个字节 并将流内的位置向前推进一个字节 如果已到达流的末尾 则返回 1 11 3 1Stream类 2 Stream类的常用方法 5 publicabstractvoidSetLength longvalue 功能 将当前流的长度设置为value 6 publicabstractvoidWrite byte buffer intoffset intcount 功能 将字节数组buffer中从offset到 offset count 1 之间的元素值写入当前流 并将此流中的当前位置提升写入的字节数 11 3 1Stream类 2 Stream类的常用方法 7 publicvirtualvoidWriteByte bytevalue 功能 将字节value写入流内的当前位置 并将流内位置向前推进一个字节 8 publicabstractlongSeek longoffset SeekOriginorigin 功能 设置当前流中的位置并返回该位置 其中 参数origin用于获取新位置的参考点 offset指示相对于origin参数的字节偏移量 origin是SeekOrigin枚举类型的参数 该枚举类型定义了用于表示流中的参考点以供进行查找的枚举值常量 包括Begin 指定流的开头 Current 指定流内的当前位置 和End 指定流的结尾 11 3 1Stream类 2 Stream类的常用方法注意 C 中 I O操作都是在当前位置进行 新建一个流对象时 当前位置一般位于流的起始位置 即Position属性值为0 每次对流进行读写后 当前位置都会相应改变 也可以使用Position属性或Seek方法有目的地改变流中的当前位置 11 3 1Stream类 FileStream类是Stream的派生类 使用它可以创建一个文件流 FileStream类可以对文件系统上的文件进行读取 写入 打开和关闭等操作 读写操作可以指定为同步或异步操作 而且 FileStream类对输入 输出进行了缓冲 从而提高了处理的性能 FileStream类主要用于二进制文件的读写 要读写二进制文件 首先必须实例化一个FileStream对象 11 3 2FileStream类 1 FileStream类的构造函数创建一个FileStream对象 要调用其构造函数 为了创建不同属性的文件流 FileStream类中定义了多种构造函数 11 3 2FileStream类 2 使用FileStream对象读写字节文件流是对物理文件的封装 比如一个文件的内容可能分散在磁盘的多个地方 但通过FileStream对象仍可以进行连续的字节流读写 从字节流到物理存储的映射细节由FileStream对象隐藏 使用FileStream对象来读写字节 以进行文件的读 写 打开 关闭等操作 例如 下面的代码创建了一个FileStream对象 通过该对象的WriteByte方法向文件中依次写入一组字节 FileStreamfs newFileStream C a txt FileMode Create FileAccess ReadWrite for bytex 1 x 10 x fs WriteByte x 但是 这种方式只适合ASCII字符 对应编码在O 255之间 而不适合汉字等Unicode字符 11 3 2FileStream类 2 使用FileStream对象读写字节使用完FileStream对象后 一定要记住使用其Close方法来关闭文件流 这样才能保持文件的完整性 例如 fs Close 关闭流会释放与它相关的系统资源 并允许其他应用程序为同一个文件设置新的流 在打开流和关闭流之间可以读写其中的数据 使用ReadByte和Read方法从文件中读取二进制数据 使用WriteByte和Write方法向文件中写入二进制数据 11 3 2FileStream类 StreamReader和StreamWriter类用于读写文本文件 不同于Stream的派生类 StreamReader和StreamWriter类用于处理文本而不是原始字节 它们分别继承自抽象类TextReader和TextWriter类 而TextReader和TextWriter类则定义了将文本作为字符进行读写的方法 要注意的是 这些方法依靠底层的FileStream对象完成具体的数据传输 FileStream类只能处理原始字节 这使得它可以用来处理任何数据文件 但不能使用FileStream类将数据直接读写到字符串中 而必须将字符串转换为字节数组 或者进行相反的操作 StreamReader和StreamWriter类提供了按文本模式读写数据的方式 如果编程人员知道某个文件中包含文本 就可以使用它们方便地进行文本读取操作 11 3 3StreamReader和StreamWriter类 使用StreamReader和StreamWriter类提供的方法 可以根据流的内容自动检测出停止读取文本的位置 例如 使用StreamReader ReadLine 方法可以一次读取一行文本 使用StreamWriter WriterLine 方法可以一次向文本文件中写入一行文本 在读取文件时 流能够自动确定下一个回车符的位置 并在该处停止读取 在写入文件时 流会自动把回车符和换行符添加到文本的尾部 StreamReader和StreamWriter类能够识别不同的编码模式 其默认编码为UTF 8 而不是ASCII 11 3 3StreamReader和StreamWriter类 1 使用StreamReader读文本文件StreamReader对象用于从文件中读取文本 可以从底层Stream对象创建StreamReader对象实例 也可以指定编码规范参数 1 StreamReader的构造函数 创建一个StreamReader对象 要调用其构造函数 StreamReader类中定义了多种构造函数 常用构造函数的语法格式如下 格式1 publicStreamReader stringpath 格式2 publicStreamReader Streamstream 格式3 publicStreamReader stringpath booldetectEncoding 格式4 publicStreamReader stringpath Encodingencoding 11 3 3StreamReader和StreamWriter类 11 3 3StreamReader和StreamWriter类 1 使用StreamReader读文本文件 2 StreamReader的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论