--------------基于C#语言主讲教师:钱哨本课学时:72课时联系方式:qianshao@bjjtxy.bj.cnWindows程序设计第三章、文件处理本章主要内容介绍3.1windows和窗体3.2VisualStutio.netIDE简介3.3事件处理CONTENT本章学习目标:•了解System.IO命名空间•掌握读写文本文件的方法•掌握向文件读写二进制数据的方法•掌握读写内存流的方法3.1System.IO命名空间另存为.xls文件另存为.bmp文件另存为.txt文件以字节形式向磁盘写数据通常称为字节流(比特流)。存储在磁盘上的字节集合称为文件3.1System.IO命名空间类密封类静态类静态类静态类密封类密封类抽象类抽象类3.1System.IO命名空间File提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。Directory公开用于创建、移动和枚举通过目录和子目录的静态方法。无法继承此类。Path对包含文件或目录路径信息的String实例执行操作。这些操作是以跨平台的方式执行的。Fileinfo提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建FileStream对象。无法继承此类。Directoryinfo公开用于创建、移动和枚举目录和子目录的实例方法。无法继承此类。Filestream公开以文件为主的Stream,既支持同步读写操作,也支持异步读写操作。Streamreader实现一个TextReader,使其以一种特定的编码从字节流中读取字符。filesyswatcher侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。1、System.io类介绍3.1System.IO命名空间2、File类的常用方法静态方法Move将指定的文件移到移到指定位置,剪切Delete删除指定文件,如果文件不存在,则将引发异常Copy将现有的文件复制到新文件CreateText创建文件OpenText打开文件文本Open打开文件3.1System.IO命名空间试一试:把C:\WinNT\Win.INI文件拷贝到C:\下的代码,怎么写?usingSystem.IO;……privatevoidbutton1_Click(objectsender,EventArgse){stringpath=@C:\WINDOWS\IE4ErrorLog.txt;stringtarget=@c:\1.txt;if(!File.Exists(path)){MessageBox.Show(对不起,未发现路径文件!);}else{File.Copy(path,target);MessageBox.Show(复制成功!);}}3.1System.IO命名空间功能改进:【代码见下】3.1System.IO命名空间3、Fileinfo类的常用方法静态方法Attributes获取或设置当前FileSystemInfo的FileAttributesCreationTime获取或设置当前FileSystemInfo对象的创建时间。Directory获取父目录的实例DirectoryName获取表示目录的完整路径的字符串。Exists获取指示文件是否存在的值Extension获取表示文件扩展名部分的字符串3.1System.IO命名空间更改代码:此次我们通过更换FileInfo类执行同样的动作;usingSystem.IO;……privatevoidbutton1_Click(objectsender,EventArgse){stringpath=@C:\WINDOWS\IE4ErrorLog.txt;stringtarget=@c:\1.txt;FileInfomyfile=newFileInfo(path);if(!myfile.Exists){MessageBox.Show(对不起,未发现路径文件!);}else{myfile.CopyTo(target);MessageBox.Show(复制成功!);}}3.1System.IO命名空间案例练习:显示文件的基本信息:【案例见下】3.1System.IO命名空间•FileInfo类和File类–两者都提供对文件类似的操作–File为静态类,直接使用;FileInfo需要实例化后才能使用。–从性能上考虑,如果你要多次操作文件,不管是针对相同的,还是不同的,请使用FileInfo,说白了,单打独斗File最棒,群殴则首推FileInfo。–每次通过File类调用某个方法时,都要占用一定的cpu,而FileInfo类只在创建FileInfo对象时执行一次安全检查。3.1System.IO命名空间4、文件夹类Directory的常用方法静态方法Move将文件或目录及其内容移到新位置CreateDirectory创建指定路径中的所有目录Delete删除指定的目录。Exists获取父目录的实例GetCreationTime获取目录的创建日期和时间。GetCurrentDirectory获取应用程序的当前工作目录GetFiles返回指定目录中的文件的名称3.1System.IO命名空间4、文件夹基本操作实验【代码见下】3.1System.IO命名空间System.IO命名空间继承类静态方法CreateText(stringFilePath)OpenText(stringFilePath)Open(stringFilePath,FileMode)Create(stringFilePath)OpenRead(stringFilePath)AppendText(stringFilePath)FileStream类File类5、File类的常用操作的静态方法3.1System.IO命名空间5、File类的常用操作的静态方法练习3.2文件流类FilestreamFileStream实例用于读写文件中的数据。要构造FileStream实例,需要以下4条信息:要访问的文件。表示如何打开文件的模式。例如,创建一个新文件或打开一个现有的文件。如果打开一个现有的文件,写入操作是覆盖文件原来的内容,还是添加到文件的末尾?表示访问文件的方式——是只读、只写,还是读写?共享访问——表示是否独占访问文件。如果允许其他流同时访问文件,则这些流是只读、只写,还是读写文件?3.2文件流类Filestream1、filestream的构造函数在构造函数中使用的FilePath,FileMode,FileAccess,FileShare分别是指:使用指定的路径、创建模式、读/写权限和共享权限FileStream已重写构造函数FileStream(stringFilePath,FileMode)FileStream(stringFilePath,FileMode,FileAccess)FileStream(stringFilePath,FileMode,FileAccess,FileShare)3.2文件流类Filestream1、filestream的构造函数参数值FileModeAppend、Create、CreateNew、Open、OpenOrCreate和TruncateFileAccessRead、ReadWrite和WriteFileShareInheritable、None、Read、ReadWrite和Write注意,对于FileMode,如果要求的模式与文件的现有状态不一致,就会抛出一个异常。如果文件不存在,Append、Open和Truncate会抛出一个异常,如果文件存在,CreateNew会抛出一个异常。Create和OpenOrCreate可以处理这两种情况,但Create会删除现有的文件,创建一个新的空文件。FileAccess和FileShare枚举是按位标志,所以这些值可以与C#的按位OR运算符|合并使用。FileMode和FileShare,FileAccess•FileMode–Append–Create–CreateNew–Open–OpenOrCreate–Truncate•FileShare–None–Read–Write–ReadWrite…………FileStreamfstream=newFileStream(Test.cs,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);………•FileAccess–Read–Write–ReadWriteFilePath:将封装的文件的相对路径或绝对路径1、filestream的构造函数3.3文件读写例子4-1——文件流filestream综合案例第一步:建立CS文件,并准备填写关于文件操作的各种方法具体代码见下(1)第二步:建立窗体文件,样式如下图所示具体代码见下(2)•如何通过用户选择文件夹,获取文件夹信息•如何通过用户选择文件,获取文件信息。•如何通过文件流建立一个新的文本文件。•如何打开文本文件后重新写文本信息流•如何在C#中定义文件和文件夹?•文件流的资源释放意义以及释放资源的基本顺序。3.3文件读写例子4-2——文件流filestream综合案例【随堂练习】【本案例您将学习到】•充分了解和学习文件对话框机制•文本文件的文件夹,文件管理。•文本文件综合操作:复杂编辑,综合查询,删除,插入等操作。3.3文件读写例子4-3——文件流filestream综合案例【随堂练习】【本案例您将学习到】3.4读写二进制文件•要使用BinaryReader和BinaryWriter类•这两个对象都需要在FileStream上创建FileStreamfilestream=newFileStream(Filename,FileMode.Create);BinaryWriterobjBinaryWriter=newBinaryWriter(filestream);最后研究的读取器/编写器组是BinaryReader和BinaryWriter,它们都从System.Object直接派生。这些类型可以让我们从基层流中以简洁的二进制格式读取或写入离散数据类型。BinaryWriter类型定义了一个多次重载的Write()方法,用于把数据类型写入基层的流。除了Write()方法,BinaryWriter还提供了另外一些成员让我们能获取或设置从Stream派生的类型,并且提供了随机数据访问的支持。二进制文件读写对象Close()Read()ReadDecimal()ReadByte()ReadInt16()ReadInt32()ReadString()Close()Flush()Write()BinaryReaderBinaryWriter写二进制文件案例(1)——图片的存储与复制运行前效果运行后效果•图片文件二进制流的读取并显示在图像控件之中;•如何将图像控件图像读取到内存流,并另外存储。•saveFileDialog控件在另存文件中的作用。【本案例您将学习到】写二进制文件案例(2)——图片文件在数据库之中的存储与读取运行前效果运行后效果•图片类型数据如何存储在数据库之中;•如何从数据库的图片数据中读出数据并显示图片信息。•二进制流和内存流在图片处理过程之中的联合使用。【本案例您将学习到】3.5读写内存流抽象类MemoryStreamBufferedStream1.对内存而不是对磁盘进行数据读写2.减少了对临时缓冲区和文件的需要1.对缓冲区进行数据读写2.允许操作系统创建自己的缓冲区3.输入/输出效率高且速度更快4.在网络通讯的时候经常会使用到Stream类1、读写内存流——MemoryStream类MemoryStream类创建这样的流,该流以内存而不是磁盘或网络连接作为支持存储区。MemoryStream封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这