资源描述
Click To Edit Title Style,第,10,章 文件读写和管理,VB.Net,程序设计教程,本章学习目标:,了解文件的分类,掌握文本文件和二进制文件的读写技术,掌握文件和文件夹的管理方法,10.1,文件和,System.IO,模型概述,按文件中的数据格式,可分成“二进制文件”和“文本文件”;按文件的存取方式,可分成“顺序文件”和“随机文件”。,(1),顺序文件,顺序文件中的数据是一个接一个顺序地存放的,而且只记录第一个数据的存储位置。,(2),随机文件,随机文件以“记录”的格式来存储数据,所谓记录,其实就是由一组相互关联的字段组合成的逻辑单位,它类似于数据库中的记录。,(3),文本文件,在文本文件中,每个字符作为一个,ASCII,码或,Unicode,码存放,占一个或两个字节。,(4),二进制文件,二进制文件是把内存中的数据按照原样保存在外部存储器上,可以直接读取或修改二进制文件中的任意字节。,10.1.1,文件的分类,10.1,文件和,System.IO,模型概述,在,VB,NET,中,有,3,种访问文件的方法,分别是:使用,VB,传统语句和函数直接访问文件;通过文件系统对象模型(,FSO,)访问文件;使用,.NET,的,System.IO,模型访问文件。用户最常用的是第三种,所以本章主要介绍使用,.NET,的,System.IO,模型访问文件。,10.1.2,访问文件的方式,10.1.3 System.IO,模型概述,System.IO,实际上是一个文件操作的类库,这些类提供了多种对文件的读写方法,以及对文件和文件夹的管理方法,这些类被声明在,System.IO,命名空间中,要使用这些类,必须引入该命名空间,其中常用的类及其功能如表,10-1,所示。,表,10-1 System.IO,模型中常用的类,类,说明,FileStream,以字节流的形式访问文件,既支持同步读写操作,也支持异步读写操作。,StreamReader,从文本文件中读入字符,并且可以定义字符的编码方式,,StreamWriter,向文本文件中写入字符,也可以定义字符的编码方式。,BinaryReader,从二进制文件中读取数据。,BinaryWriter,向二进制文件中写入数据。,File,提供用于创建、复制、删除、移动和打开文件的,静态方法,,并协助创建,FileStream,对象。,FileInfo,提供创建、复制、删除、移动和打开文件的,实例方法,,并且帮助创建,FileStream,对象。无法继承此类。,Directory,提供用于创建、移动和遍历目录和子目录的,静态方法,。无法继承此类。,DirectoryInfo,提供用于创建、移动和遍历目录和子目录的,实例方法,。无法继承此类。,10.2,文件的读写操作,StreamReader,类和,StreamWriter,类分别以流的方式读写文本文件,读写时可以指定字符的特定编码。默认编码为,UTF-8,,而不是本地系统的,ANSI,编码。,UTF-8,可以正确处理,Unicode,字符并在各主机的操作系统中提供一致的结果。读写文本文件的基本步骤为:,(,1,)使用,New,方法创建,StreamReader/StreamWriter,对象,将它与文本文件关联(打开文件的数据流通道)。,(,2,)调用对象的成员方法从文件中读写字符,(,3,)关闭,StreamReader/StreamWriter,对象和数据流。,10.2.1,文本文件的读写操作,10.2,文件的读写操作,1,StreamReader,类,StreamReader,又称为读取器,它提供了多个用于创建对象和读取文件的方法。,【,例,10-1】,读取文本文件,将其内容显示在窗体中。,图,10-1,读取文本文件,具体操作步骤和源程序参见教材,10.2,文件的读写操作,(1)New,方法,建立,StreamReader,对象与文件的关联,以及打开数据流通道,是通过向,New,方法传递参数完成的。,New,方法重载,功能说明,StreamReader(String),以指定的文件名初始化,StreamReader,类的新实例。,StreamReader(String,Encoding),以指定的文件名和字符编码初始化,StreamReader,类的一个新实例。,StreamReader(Stream),以指定的流初始化,StreamReader,类的新实例。,StreamReader(Stream,Encoding),以指定的流和字符编码初始化,StreamReader,类的新实例。,表,10-2 StreamReader,类的,New,方法,注意:调用,New,方法而不指定字符编码,则程序采用默认的,UTF-8,编码读取文件。,10.2,文件的读写操作,(2)FileStream,类,FileStream,类用于创建指向某个文件的流对象,基本的书写形式为:,Dim fs as New FileStream(“D:VSChapter10,文本文件,.txt,FileMode.Open,FileAccess.ReadWrite),第一个参数为文件全路径名。第二个参数为,FileMode,枚举类型值,用于指定访问文件的模式,第三个参数为,FileAccess,枚举类型值,用于指定访问文件的权限,值,功能说明,Append,打开现有文件并查找到文件尾,或创建新文件。,FileMode.Append,只能同,FileAccess.Write,一起使用。任何读尝试都将失败并引发,ArgumentException,。,Create,指定操作系统应创建新文件。如果文件已存在,它将被改写。如果文件不存在,则使用,CreateNew,;否则使用,Truncate,。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_7864c129.htm,指定操作系统应创建新文件。如果文件已存在,则将引发,IOException,。,Open,指定操作系统应打开现有文件。打开文件的能力取决于,FileAccess,所指定的值。如果该文件不存在,则引发,System.IO.FileNotFoundException,。,OpenOrCreate,指定操作系统应打开文件(如果文件存在);否则,应创建新文件。,Truncate,指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。,方法,功能说明,Read,对文件的读访问。可从文件中读取数据。,ReadWrite,对文件的读访问和写访问。可从文件读取数据和将数据写入文件。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_7864c129.htm,文件的写访问。可将数据写入文件。,表,10-3 FileMode,值及其说明,表,10-4 FileAccess,值及其说明,10.2,文件的读写操作,(3),读取方法,方法,功能说明,Read,读取输入流中的下一个字符。,Read(buffer,index,count),从,index,开始,从当前流中将最多的,count,个字符读入,buffer,。,ReadLine,从当前流中读取一行字符并将数据作为字符串返回。,ReadToEnd,从流的当前位置到末尾读取流。,【,例,10-2】,修改例,10-1,,用其它方法读取文件。,设计界面如图,10-2,,点击第一个按钮,通过循环从文件中一个一个读取字符,直到文件结尾,,StreamReader,类中有一个只读属性,EndOfStream,,其值为,true,表示已到文件结尾,其值为,false,表示未到结尾。点击第二个按钮,读取文件的前,10,个字符到,Char,型数组。点击第三个按钮,通过循环一行一行读取字符,直到结尾。,图,10-2,读取文本文件,10.2,文件的读写操作,2,StreamWriter,类,StreamWriter,又称为写入器,用于向文本文件中写入字符,也可以指定字符的编码方式。,(1)StreamWriter,类的,New,方法,New,方法重载,功能说明,StreamWriter(String),使用默认编码,(UTF-8),和缓冲区大小,为指定文件名初始化,StreamWriter,类的新实例。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_7864c129.htm,用默认编码,(UTF-8),及默认缓冲区大小,为指定的流初始化,StreamWriter,类的一个新实例。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_6b1b565e.htm,用指定的编码及默认缓冲区大小,为指定的流初始化,StreamWriter,类的新实例。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_0beea57f.htm,用指定的编码及缓冲区大小,为指定的流初始化,StreamWriter,类的新实例。,(2)StreamWriter类写文件的方法,方法,功能说明,Write(,参数,),将参数中指定数据写入文件,WriteLine,(,参数,),将参数中指定数据后跟换行符写入文件,注意:,Write,和,WriteLine,都是重载方法,它们可以接受各种类型的参数,例如下面几种重载形式。,StreamWriter.Write(Int32),StreamWriter.Write(Double),StreamWriter.Write(String),StreamWriter.Write(Char),10.2,文件的读写操作,【,例,10-3】,设计窗体如图,10-3,,将左边文本框的数据写入文件,D:VSChapter10,文本文件,2.txt,中,在右边文本框中显示文件的内容。,图,10-3,写入文本文件,具体操作步骤和源程序参见教材,10.2,文件的读写操作,二进制文件通常扩展名为“,dat”,,一般利用,BinaryReader,类从二进制文件中读取数据,利用,BinaryWriter,类向二进制文件中写入数据。,10.2.2,二进制文件的读写操作,1,BinaryReader,类,(,1,),BinaryReader,类的,New,方法,New,方法重载,功能说明,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_7864c129.htm,基于所提供的流,用,UTF8Encoding,初始化,BinaryReader,类的新实例。,ms.msdnqtr.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/C_System_IO_StreamReader_ctor_1_6b1b565e.htm,基于所提供的流和特定的字符编码,初始化,BinaryReader,类的新实例。,(2)BinaryReader类的常用方法,方法,功能说明,PeekChar,返回下一个可用的字符,并且不提升字节或字符的位置。,Read,已重载。从基础流中读取字符,并提升流的当前位置。,ReadBoolean,从当前流中读取,Boolean,值,并使该流的当前位置提升,1,个字节。,ReadByte,从当前流中读取下一个字节,并使流的当前位置提升,1,个字节。,ReadBytes,从当前流中将,count,个字节读入字节数组,并使当前位置提升,count,个字节。,ReadChar,从当前流中读取下一个字符,并根据所使用的,Encoding,和从流中读取的特定字符,提升流的当前位置。,ReadChars,从当前流中读取,count,个字符,以字符数组的形式返回数据,并根据所使用的,Encoding,和从流中读取的特定字符,提升当前位置。,ReadDecimal,从当前流中读取十进制数值,并将该流的当前位置提升十六个字节。,ReadDouble,从当前流中读取,8,字节浮点值,并使流的当前位置提升,8,个字节。,10.2,文件的读写操作,(2)BinaryReader类的常用方法,方法,功能说明,ReadInt16,从当前流中读取,2,字节有符号整数,并使流的当前位置提升,2,个字节。,ReadInt32,从当前流中读取,4,字节有符号整数,并使流的当前位置提升,4,个字节。,ReadInt64,从当前流中读取,8,字节有符号整数,并使流的当前位置向前移动,8,个字节。,ReadSByte,从此流中读取一个有符号字节,并使流的当前位置提升,1,个字节。,ReadSingle,从当前流中读取,4,字节浮点值,并使流的当前位置提升,4,个字节。,ReadString,从当前流中读取一个字符串。字符串有长度前缀,一次,7,位地被编码为整数。,ReadUInt16,使用,Little Endian,编码从当前流中读,2,字节无符号整数,并将流的位置提升,2,个字节。,ReadUInt32,从当前流中读取,4,字节无符号整数并使流的当前位置提升,4,个字节。,ReadUInt64,从当前流中读取,8,字节无符号整数并使流的当前位置提升,8,个字节。,2,BinaryWriter,类,以二进制形式将基本类型的数据写入文件,并支持特定的编码。该类只有一个,Write,方法用于写文件,但它有多种重载形式,可以将任意类型的数据写入文件。,【,例,10-4】,依次将,Integer,型数据,65535,,,String,型数据“似水年华”(该字符串占,10,个字符位),,Double,型数据,3.1416,写入文件,D:VSChapter10,二进制文件,.dat,,再分别读取它们,显示在文本框中。运行结果如图,10-4,所示。,图,10-4,读写二进制文件,1,File,类和,FileInfo,类,这两个类主要用于文件操作,但它们是有区别的:在应用程序中使用,File,类不必创建类的实例,就可以调用它的方法,而,FileInfo,类中的方法都是实例方法,必须在创建实例后才能调用。,10.3,文件及文件夹的管理,方法,功能说明,AppendAllText,已重载。将指定的字符串追加到文件中,如果文件还不存在则创建该文件。,AppendText,创建一个,StreamWriter,,它将,UTF-8,编码文本追加到现有文件。,Copy,已重载。将现有文件复制到新文件。,Create,已重载。在指定路径中创建文件。,CreateText,创建或打开一个文件用于写入,UTF-8,编码的文本。,Delete,删除指定的文件。如果指定的文件不存在,则不引发异常。,Exists,确定指定的文件是否存在。,GetAttributes,获取在此路径上的文件的,FileAttributes,。,GetCreationTime,返回指定文件或目录的创建日期和时间。,GetLastAccessTime,返回上次访问指定文件或目录的日期和时间。,GetLastWriteTime,返回上次写入指定文件或目录的日期和时间。,Move,将指定文件移到新位置,并提供指定新文件名的选项。,Open,已重载。打开指定路径上的,FileStream,。,OpenRead,打开现有文件以进行读取。,OpenText,打开现有,UTF-8,编码文本文件以进行读取。,OpenWrite,打开现有文件以进行写入。,1,File,类和,FileInfo,类,10.3,文件及文件夹的管理,方法,功能说明,ReadAllBytes,打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。,ReadAllLines,已重载。打开一个文本文件,将文件的所有行都读入一个字符串数组,然后关闭该文件。,ReadAllText,已重载。打开一个文本文件,将文件的所有行读入一个字符串,然后关闭该文件。,Replace,已重载。使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。,SetAttributes,设置指定路径上文件的指定的,FileAttributes,。,SetCreationTime,设置创建该文件的日期和时间。,SetLastAccessTime,设置上次访问指定文件的日期和时间。,SetLastWriteTime,设置上次写入指定文件的日期和时间。,WriteAllBytes,创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。如果目标文件已存在,则改写该文件。,WriteAllLines,已重载。创建一个新文件,在其中写入指定的字符串,然后关闭文件。如果目标文件已存在,则改写该文件。,WriteAllText,已重载。创建一个新文件,在文件中写入内容,然后关闭文件。如果目标文件已存在,则改写该文件。,2.Directory,类与,DirectoryInfo,类,这两个类主要用于文件夹操作,都提供了一些用于创建文件夹、移动文件夹和遍历文件夹的方法。,10.3,文件及文件夹的管理,方法,功能说明,CreateDirectory,已重载。创建指定路径中的所有目录。,Delete,已重载。删除指定的目录。,Exists,确定给定路径是否引用磁盘上的现有目录。,GetCreationTime,获取目录的创建日期和时间。,GetCurrentDirectory,获取应用程序的当前工作目录。,GetDirectories,已重载。获取指定目录中子目录的名称。,GetDirectoryRoot,返回指定路径的卷信息、根信息或两者同时返回。,GetFiles,已重载。返回指定目录中的文件的名称。,GetFileSystemEntries,已重载。返回指定目录中所有文件和子目录的名称。,GetLastAccessTime,返回上次访问指定文件或目录的日期和时间。,GetLastWriteTime,返回上次写入指定文件或目录的日期和时间。,GetLogicalDrives,检索此计算机上格式为“,:”,的逻辑驱动器的名称。,GetParent,检索指定路径的父目录,包括绝对路径和相对路径。,Move,将文件或目录及其内容移到新位置。,SetCreationTime,为指定的文件或目录设置创建日期和时间。,SetCurrentDirectory,将应用程序的当前工作目录设置为指定的目录。,SetLastAccessTime,设置上次访问指定文件或目录的日期和时间。,SetLastWriteTime,设置上次写入目录的日期和时间。,【,例,10-5】,在“,D:VSChapter10”,路径下创建“教师档案”目录,在该目录下创建若干文本文件,每个文件录入一名教师的资料,文件名为教师的姓名,再创建一个“档案汇总”目录,在该目录中创建“汇总文件”,这个文件包含所有教师的资料以及这些资料所在文件的创建时间,接着创建“档案备份”目录,将“汇总文件”和所有教师的档案复制到“档案备份”目录。,设计操作界面如下图,点击“建立目录”区域的三个链接,会在“,D:VSChapter10”,路径下创建相应的文件夹,在“录入教师资料”区域输入每位教师信息,点击按钮则在“教师档案”目录中新建以“姓名”命名的文本文件,并将教师信息写入该文件,文件的内容和“教师档案”目录中的内容如图,10-6,、,10-7,所示。点击“资料汇总”区域中的,2,个链接,可在“档案汇总”目录中生成汇总文件以及将所有文件复制到“档案备份”文件。汇总文件的内容和“档案备份”目录中的内容如,10-8,、,10-9,所示。,10.4,综合实例,图,10-5,管理文件和文件夹,10.4,综合实例,图,10-6,教师个人档案,图,10-7,教师档案目录中的文件,图,10-8,汇总文件内容,图,10-9,档案备份目录中的文件,具体操作步骤和源程序参见教材,10.5,实训项目十,在,D,盘创建文件夹,Stu10,,按要求完成如下实训练习,保存在,D:Stu10,路径下。,完善,【,例,10-5】,教师档案管理程序,设计一个可以浏览、更新和删除教师档案的界面,如图,10-12,所示。要求实现以下功能:,(,1,)通过选择界面上方的下拉列表(,ComboBox1,),可以查看全部教师的档案,也可以查看某个系部教师的档案,选中某个系,就在中间的列表控件(,ListBox1,)显示该系的教师档案,如图,10-13,所示。,(,2,)选中列表控件的某行记录,在下方“教师档案更新”区域,显示该教师各项信息。,(,3,)可以在“教师档案更新”区域修改各项信息,点击“更新”按钮,则将更新后的档案写入对应文件。例如,图,10-14,将“王刚”老师的年龄改为,31,,他的档案所在文件的内容也更新了,如图,10-15,。,(,4,)点击“删除”按钮,可以删除当前这个档案所在的文件。,10.5,实训项目十,图,10-12,教师档案管理界面,图,10-13,按系部浏览教师档案,图,10-14,更新档案,图,10-15,更新后的档案写入文件,10.5,实训项目十,【,操作提示,】,(,1,)本程序所操作的文件,全部在,【,例,10-5】,建立的“教师档案”目录中,每位教师对应一个文本文件,姓名就是文件名。,(,2,)编写,Form_Load,事件处理过程,读取所有教师的档案文件,整理成图,10-12,所示的格式(每个档案占一行)加载到列表控件中(,ListBox1,),(,3,)为上方的下拉列表(,ComboBox1,)编写,SelectedIndexChanged,事件处理过程,读取所有教师的档案,但只保留被选中的系部的教师档案,加载到列表控件中。,(,4,)为列表控件(,ListBox1,)编写,SelectedIndexChanged,事件处理过程,将被选中的教师档案显示在下方的“教师档案更新”区域。,(,5,)为“更新”按钮编写,Click,事件处理过程,将档案中各字段的值写入对应的文件。,(,6,)为“删除”按钮编写,Click,事件处理过程,将对应的档案文件删除。,
展开阅读全文