320 likes | 474 Views
第八章. 文件与流. 本章目标. 流,了解 System.IO 命名空间 掌握读写文本文件的方法 掌握向文件读写二进制数据的方法 掌握读写内存流的方法. IO 命名空间. .Net 中 IO 命名空间中包含了两部分的内容 管理文件系统 移动、复制、删除等以整个文件为操作对象的方法 得到和修改文件的属性信息 操作文件具体内容 向文件中写入和读取文件的内容 向内存中写入和读取内存的内容. 管理文件系统. 在 .Net 体系结构中管理文件系统的类 按访问的内容分为: 文件类 File FileInfo 文件夹类 Directory
E N D
第八章 文件与流
本章目标 • 流,了解System.IO 命名空间 • 掌握读写文本文件的方法 • 掌握向文件读写二进制数据的方法 • 掌握读写内存流的方法
IO命名空间 • .Net中IO命名空间中包含了两部分的内容 • 管理文件系统 • 移动、复制、删除等以整个文件为操作对象的方法 • 得到和修改文件的属性信息 • 操作文件具体内容 • 向文件中写入和读取文件的内容 • 向内存中写入和读取内存的内容
管理文件系统 • 在.Net体系结构中管理文件系统的类 • 按访问的内容分为: • 文件类 • File • FileInfo • 文件夹类 • Directory • DirectoryInfo
管理文件系统 • 在.Net体系结构中管理文件系统的类 • 按类中方法的访问方式分为: • 静态方法类 • File • Directory • 实例方法类 • FileInfo • DirectoryInfo
管理文件系统 • File类和Directory类不能被实例化,它们中包含的方法都是静态方法 • FileInfo和DirectoryInfo类必须被实例化,才能使用,它们中包含的方法都不是静态方法
管理文件系统 • File类和FileInfo类执行基本相同的方法 • FileInfo类创建实例后,是有状态的 • 如果要多次使用到文件的信息,那么在以后使用的时候,只管读取就可以了 • File类的使用,不需要实例 • 方便使用,但是要读取文件的信息,必须每次都将文件包装在File类中 • Directory类和DirectoryInfo的情况与File类和FileInfo类的情况类似
文件操作功能 • 可以对文件进行以下操作 • 复制 • 删除 • 移动 • 获取和设置文件属性(只读,隐藏,系统) • 获取和设置文件的信息(文件名、目录名、修改时期,创建日期,长度)
文件名的说明 • 文件名的说明 • 一般的文件名中都包含“\”,但是在C#中“\”用作转义字符 • 解决方案 • 将文件名中的“\”从一个变为两个 • “C:\\abc\bcd.txt” • 在文件名字符串前加@ • @“c:\abc\bcd.txt”
文件示例 • 文件名的说明
目录操作功能 • 可以对目录进行以下操作 • 创建 • 删除 • 移动 • 获取和设置目录属性(只读,隐藏,系统) • 获取和设置目录的信息(目录名、父目录名、修改时期,创建日期) • 列出当前目录下所有的文件或者目录
目录操作功能 • 如何得到当前计算机上的所有驱动器? • Directory. GetLogicalDrives()
目录操作功能 • 可以对目录进行以下操作
文件操作类作业 • 作一个方法: • 无返回类型 • 参数:目录名称 • 功能:得到这个目录下所有的目录和文件,并且将目录信息(名称,最后修改时间)和文件信息(名称,最后修改时间,大小)列举出来
流介绍 • 流是一个用于传输数据的对象,数据有两个传输方向 • 数据从外部源到程序(输入流) • 数据从程序到外部源(输出流) • 流本身没有方向性,操作流的对象有方向性 • 读取(输入) • 写入(输出) • 查找(有缓冲的才支持)
流的分类 • 按照流操作的目标对象的不同分为以下类别 • 文件流 • 网络流 • 内存流 • 字符流 • ……
流的操作器 • 按照流操作方式的不同分为以下类别 • 读取器 • 写入器
文件流 • 文件流:流的来源或目标是文件 • 对于读取功能,流的来源是文件 • 对于写入功能,流的目标是文件 • 文件流的产生: • 使用File类或者FileInfo类产生 • 使用FileStream类直接产生 • ……
FileStream构造函数 • FileStream 构造函数 在构造函数中使用的 FileMode、FileAccess 和 FileShare 参数都是 enum 类型
FileStream的读取和写入 • 在用File类或FileInfo类产生的流对象中,根据方法的不同,产生不同的读写效果 • 在FileStream的构造方法中,可以根据参数的不同,来决定了这个流是否读写
FileStream选项 • FileMode:控制是否对文件执行改写、创建、打开等操作,或执行这些操作的组合。 • FileAccess:控制是否写入,读取或读取写入 • FileShare:控制当前流的共享方式
文件流示例(Ascii Read) • ASCII文件
文件流示例(Ascii Write) • ASCII文件
文本文件的操作 • StreamReader:读取流中的内容 • StreamWriter:向流中写入内容,写完后,一定要Flush • Unicode编码问题 • 记事本默认是Ascii编码
中文问题 • 文件是Ascii,必须使用解码器 • 文件是Unicode,随便都可以解开
二进制文件的操作 • BinaryReader:读取二进制 • BinaryWriter:写入二进制
流的缓冲 • BufferedStream • 对缓冲区进行数据读写 • 允许操作系统创建自己的缓冲区 • 输入/输出效率高且速度更快 • 在网络通讯的时候经常会使用到 • 使用BufferedStream将其他流进行包装,以更高的效率进行读写
流的缓冲 • BufferedStream是向另一个 Stream(例如 NetworkStream)添加缓冲 • 的 Stream。以提高读写性能MemoryStream 是一个非缓冲的流,可以在 • 内存中直接访问它的封装数据。该流没有后备存储器,可用作临时缓冲区。 • NetworkStream 表示网络连接上的 Stream。 • CryptoStream 将数据流链接到加密转换
通过缓冲区交换数据 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的实例
通过缓冲区交换数据 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