1 / 32

第八章

第八章. 文件与流. 本章目标. 流,了解 System.IO 命名空间 掌握读写文本文件的方法 掌握向文件读写二进制数据的方法 掌握读写内存流的方法. IO 命名空间. .Net 中 IO 命名空间中包含了两部分的内容 管理文件系统 移动、复制、删除等以整个文件为操作对象的方法 得到和修改文件的属性信息 操作文件具体内容 向文件中写入和读取文件的内容 向内存中写入和读取内存的内容. 管理文件系统. 在 .Net 体系结构中管理文件系统的类 按访问的内容分为: 文件类 File FileInfo 文件夹类 Directory

mili
Download Presentation

第八章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第八章 文件与流

  2. 本章目标 • 流,了解System.IO 命名空间 • 掌握读写文本文件的方法 • 掌握向文件读写二进制数据的方法 • 掌握读写内存流的方法

  3. IO命名空间 • .Net中IO命名空间中包含了两部分的内容 • 管理文件系统 • 移动、复制、删除等以整个文件为操作对象的方法 • 得到和修改文件的属性信息 • 操作文件具体内容 • 向文件中写入和读取文件的内容 • 向内存中写入和读取内存的内容

  4. 管理文件系统 • 在.Net体系结构中管理文件系统的类 • 按访问的内容分为: • 文件类 • File • FileInfo • 文件夹类 • Directory • DirectoryInfo

  5. 管理文件系统 • 在.Net体系结构中管理文件系统的类 • 按类中方法的访问方式分为: • 静态方法类 • File • Directory • 实例方法类 • FileInfo • DirectoryInfo

  6. 管理文件系统 • File类和Directory类不能被实例化,它们中包含的方法都是静态方法 • FileInfo和DirectoryInfo类必须被实例化,才能使用,它们中包含的方法都不是静态方法

  7. 管理文件系统 • File类和FileInfo类执行基本相同的方法 • FileInfo类创建实例后,是有状态的 • 如果要多次使用到文件的信息,那么在以后使用的时候,只管读取就可以了 • File类的使用,不需要实例 • 方便使用,但是要读取文件的信息,必须每次都将文件包装在File类中 • Directory类和DirectoryInfo的情况与File类和FileInfo类的情况类似

  8. 文件操作功能 • 可以对文件进行以下操作 • 复制 • 删除 • 移动 • 获取和设置文件属性(只读,隐藏,系统) • 获取和设置文件的信息(文件名、目录名、修改时期,创建日期,长度)

  9. 文件名的说明 • 文件名的说明 • 一般的文件名中都包含“\”,但是在C#中“\”用作转义字符 • 解决方案 • 将文件名中的“\”从一个变为两个 • “C:\\abc\bcd.txt” • 在文件名字符串前加@ • @“c:\abc\bcd.txt”

  10. 文件示例 • 文件名的说明

  11. 目录操作功能 • 可以对目录进行以下操作 • 创建 • 删除 • 移动 • 获取和设置目录属性(只读,隐藏,系统) • 获取和设置目录的信息(目录名、父目录名、修改时期,创建日期) • 列出当前目录下所有的文件或者目录

  12. 目录操作功能 • 如何得到当前计算机上的所有驱动器? • Directory. GetLogicalDrives()

  13. 目录操作功能 • 可以对目录进行以下操作

  14. 文件操作类作业 • 作一个方法: • 无返回类型 • 参数:目录名称 • 功能:得到这个目录下所有的目录和文件,并且将目录信息(名称,最后修改时间)和文件信息(名称,最后修改时间,大小)列举出来

  15. 流介绍 • 流是一个用于传输数据的对象,数据有两个传输方向 • 数据从外部源到程序(输入流) • 数据从程序到外部源(输出流) • 流本身没有方向性,操作流的对象有方向性 • 读取(输入) • 写入(输出) • 查找(有缓冲的才支持)

  16. 流的分类 • 按照流操作的目标对象的不同分为以下类别 • 文件流 • 网络流 • 内存流 • 字符流 • ……

  17. 流的操作器 • 按照流操作方式的不同分为以下类别 • 读取器 • 写入器

  18. 文件流 • 文件流:流的来源或目标是文件 • 对于读取功能,流的来源是文件 • 对于写入功能,流的目标是文件 • 文件流的产生: • 使用File类或者FileInfo类产生 • 使用FileStream类直接产生 • ……

  19. File类产生FileStream

  20. FileStream构造函数 • FileStream 构造函数 在构造函数中使用的 FileMode、FileAccess 和 FileShare 参数都是 enum 类型

  21. FileStream的读取和写入 • 在用File类或FileInfo类产生的流对象中,根据方法的不同,产生不同的读写效果 • 在FileStream的构造方法中,可以根据参数的不同,来决定了这个流是否读写

  22. FileStream选项 • FileMode:控制是否对文件执行改写、创建、打开等操作,或执行这些操作的组合。 • FileAccess:控制是否写入,读取或读取写入 • FileShare:控制当前流的共享方式

  23. 文件流示例(Ascii Read) • ASCII文件

  24. 文件流示例(Ascii Write) • ASCII文件

  25. 文本文件的操作 • StreamReader:读取流中的内容 • StreamWriter:向流中写入内容,写完后,一定要Flush • Unicode编码问题 • 记事本默认是Ascii编码

  26. 中文问题 • 文件是Ascii,必须使用解码器 • 文件是Unicode,随便都可以解开

  27. 中文问题示例

  28. 二进制文件的操作 • BinaryReader:读取二进制 • BinaryWriter:写入二进制

  29. 流的缓冲 • BufferedStream • 对缓冲区进行数据读写 • 允许操作系统创建自己的缓冲区 • 输入/输出效率高且速度更快 • 在网络通讯的时候经常会使用到 • 使用BufferedStream将其他流进行包装,以更高的效率进行读写

  30. 流的缓冲 • BufferedStream是向另一个 Stream(例如 NetworkStream)添加缓冲 • 的 Stream。以提高读写性能MemoryStream 是一个非缓冲的流,可以在 • 内存中直接访问它的封装数据。该流没有后备存储器,可用作临时缓冲区。 • NetworkStream 表示网络连接上的 Stream。 • CryptoStream 将数据流链接到加密转换

  31. 通过缓冲区交换数据 2-1 public static void Main( ) { Console.WriteLine (“请输入文件名:"); string name = Console.ReadLine(); Console.WriteLine (“请输入备份文件名:"); string backup = Console.ReadLine(); if(File.Exists(name)) { Stream inputStream = File.OpenRead(name); Stream outputStream = File.OpenWrite(backup); BufferedStream bufferedInput =new BufferedStream(inputStream); BufferedStream bufferedOutput =new BufferedStream(outputStream); Stream 和 BufferedStream的实例

  32. 通过缓冲区交换数据 2-2 byte[] buffer = new Byte[sizeBuff]; int bytesRead; while ((bytesRead = bufferedInput.Read(buffer,0,sizeBuff)) > 0 ) { bufferedOutput.Write(buffer,0,bytesRead); } Console.WriteLine(); Console.WriteLine("给定备份的文件已创建"); bufferedOutput.Flush( ); bufferedInput.Close( ); bufferedOutput.Close( ); } else { Console.WriteLine ("文件不存在"); } } 通过缓冲区进行读写 刷新并关闭 BufferStream

More Related