第十章文件管理应用程序大都要从文件中读取信息或向文件写入信息,例如用户使用Word时就把撰写的文档保存到doc格式的文件中,以备以后重复使用所撰写的内容。从计算机科学的角度上讲,文件是存储在计算机外部存储介质上的数据集合。在外部介质上数据文件总是按名存取的。如果想访问存放在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。10.1数据文件的概述10.1.1文件及其结构1、记录记录—是VB处理数据的基本单位,它由若干个相互关联的数据项组成。在数据处理中,表示一件事或一个人的某些属性就可构成一个记录。如:学生成绩登记,每个学生的成绩等信息组成一个记录学号姓名数学成绩语文成绩物理成绩总分2、文件及其种类文件是记录的集合。如,某班有100个同学,则100个同学的记录组成了一个学生成绩文件。VB提供了三种访问模式:顺序访问模式随机访问模式二进制访问模式按照访问模式的不同,文件分成三类:顺序文件随机文件二进制文件10.1.3文件处理的一般步骤写文件操作是计算机把程序中处理后的数据存储到外存储器上,读文件操作是计算机把外存储器上存储的文件数据读取到计算机的程序中。文件操作的一般步骤是:⑴打开(或新建)文件。为文件建立一个特定的文件缓中区,每一个文件在内存中都必须有一个独立的读、写缓冲区。⑵进行读/写操作。在对文件进行读、写操作时,为了记住当前读、写的位置,文件中设置了一个文件指针。⑶关闭文件。把文件缓冲区中暂存的数据写入外存储器(写操作)或清除掉(读操作)。10.1.4相关语句和函数1.打开文件(Open)一般语法格式为:Open文件名[For模式][Access存取类型][锁定]As[#]文件号[Len=记录长度]2.关闭文件(Close)使用格式:Close[[#]文件号1[,[#]文件号2…))3.FreeFile函数使用格式:FreeFile功能:返回一个在程序中没有使用的文件号供Open语句使用。4.Seek语句和Seek函数文件打开后,会自动生成一个文件指针,文件的读或写就从这个指针所指的位置开始。⑴Seek函数的使用格式Seek(文件号)功能:返回文件指针的当前位置。对于随机文件,Seek函数返回指针当前所指的记录号。对于顺序文件和二进制文件,Seek函数返回指针所在的当前字节位置(从头算起的字节数)。⑵Seek语句的格式Seek[#]文件号,位置功能:将指定文件的文件指针设置在指定位置,以便进行下一次读或写操作。“位置”参数是一个1~2,147,483,647的整数。5.EOF函数格式:EOF(文件号)功能:测试与文件号相关的文件指针是否已移到文件的结束位置。如果是,函数值为真(True),否则为假(False)。6.LOF函数格式:LOF(文件号)功能:返回与文件号相关的文件的总字节数。注意,对于尚未打开的文件,使用函数FileLen(文件名)取得文件的长度。7.Loc函数格式:Loc(文件号)功能:返回与文件号相关的文件的当前读写位置。10.2顺序访问模式顺序访问模式—读出时从第一条记录“顺序”读到最后一条记录,写入时也一样,不可以在数据间乱跳。顺序访问模式是专门提供给处理文本文件的。文本文件中的每一行字符串就是一条记录,每条记录可长可短,记录之间是以换行字符为分隔符将数据写入顺序文件,通常有三个步骤:打开、写入、关闭从顺序文件读数据到内存,通常有三个步骤:打开、读出、关闭1、打开文件在对文件进行任何操作前,必须先打开文件,同时通知操作系统对文件进行读操作还是写操作。打开文件的命令是OPEN语句格式如下:Open“文件名”For模式As[#]文件号[LEN=记录长度]其中:“文件名”可以是字符串常量或字符串变量“模式”为下列三种形式之一OutPut:打开一个文件,将对该文件进行写操作。InPut:打开一个文件,将对该文件进行读操作。Append:打开一个文件,将在该文件末尾追加记录“文件号”是一个介于1-511之间的整数。当打开一个文件并为它指定一个文件号后,该文件号就代表该文件,直到文件被关闭后,该文件号才能被其他文件使用。例:如果要打开C:\VB目录下一个名为SCORE的文件,供写入数据,指定文件号为#1,则命令应该为?2、写操作将数据写入磁盘文件所用的命令是Write#或Print#命令,其格式为:(1)Print#文件号,[输出表列]其中:“输出列表”是指[{spc(n)|tab(n)]}[表达式列表][;|,]OpenC:\VB\SCOREForOutPutAS#1例:利用Print#语句把数据写入文件。OpenD:\TESTFILEForOutPutAs#1Print#1,ThisisatestPrint#1,Print#1,Zone1;Tab;Zone2Print#1,Hello;;WorldPrint#1,Spc(5);5leadingspacesPrint#1,Tab(10);HelloClose#1‘打开文件供输出‘输出一个空行‘在两个打印区中输出‘用空格分隔字符串‘先输出5个签到空格,在输出字符串‘在第10列上输出字符串‘关闭文件应用:在实际应用中,经常要把一个文本框的内容以文件的形式保存在磁盘上,共有下列两种方法。现假设文本框的名称为Text1,文件名为Test.dat方法一:把整个文本框的内容一次性写入文件。方法二:把文本框的内容一个字符一个字符的写入文件OpenTest1.datForOutPutAs#1Print#1,Text1.TextClose#1OpenTest1.datForOutPutAs#1Fori=1ToLen(Text1.Text)Print#1,Mid(Text1.Text,i,1);NextiClose#1(2)Write#文件号,[输出列表]其中“输出列表”一般是指用“,”分隔的数值或字符串表达式。Write#的功能基本上与Print#语句相同,区别在于Write#是以紧凑格式存放,即在数据之间插入“,”,并给字符串加上双引号。例:用Write#语句将数据写入文件3、关闭文件当结束各种读写操作后,还要关闭文件,否则会造成数据丢失。关闭文件所用的语句是Close,格式为:Close[[#]]文件号][,[#]文件号]…4、读操作读顺序文件的语句有下列三种:(1)InPut#文件号,变量列表使用该语句将从文件中读出数据,并将读出的数据赋给指定的变量。注意:为了能够用InPut#将文件中的数据正确的读出,在将数据写入文件时,要用Write#语句,因Write#语句能够将各个数据项正确得区分开。(2)LineInPut#文件号,字符串变量使用该语句可以从文件中读出一行数据,并将读出的数据赋给指定的字符串变量。读出的数据中不包含回车符和换行符(3)InPut$(读取的字符数,#文件号)调用该函数可以读取指定数目的字符。将一个文本文件的内容读如文本框有下列三种方法。现假设文本框名称为Text1,文件名为MyFile.txt方法一:把文本文件的内容一行一行得读入文本框OpenMyFile.txtForInPutAs#1DoWhileNotEOF(1)LineInPut#1,InPutDataLoopClose#1Text1.Text=Text1.Text=Text1.Text+InPutData+vbCrLf方法二:把文本的内容一次性读入文本框。OpenMyFile.txtForInPutAs#1Close#1Text1.Text=Text1.Text=InPut$(LOF(1),#1)方法三:把文件的内容一个字符一个字符的读入文本框OpenMyFile.txtForInPutAs#1DoWhileNotEOF(1)InPutData=InPut$(1,#1)LoopClose#1Text1.Text=Text1.Text=Text1.Text+InPutDataDimInPutDataAsString*110.3随机访问模式特点:在随机访问模式中,文件的存取是按记录进行操作的,每个记录都有记录号,并且长度相同。1、随机访问模式中文件的打开(1)打开仍然用Open语句。格式为:其中:随机文件的打开模式只有Random一种。记录长度指定了每条记录的长度,默认值是128(2)关闭仍然用Close语句Open“文件名”[ForRandom]As#文件号LEN=记录长度2、随机访问模式中文件的读写打开随机文件后,就可以进行读写操作了。(1)随机访问模式中文件的写操作用Put命令。格式为;Put#文件号,[记录号],变量名其中:Put命令是将一个记录变量的内容,写入所打开的磁盘文件中指定的记录位置处。记录号是大于1的整数,表示写入的是记录的位置。如果忽略,则表示在当前记录后插入一条记录。(2)随机访问模式中文件的读操作使用Get命令格式为:Get#文件号,[记录号],变量名其中:Get命令是从打开的磁盘文件中将一条由记录号指定的记录内容读入记录变量中。记录号是大于1的整数,表示对第几条记录进行操作。如果忽略,则表示读入当前记录例:P29510-610.4二进制访问模式特点:二进制访问模式与随机访问模式类似,读写语句也是Get和Put,区别在与二进制模式的访问单位是字节,而随机访问模式的单位是记录。在二进制访问模式中,可以把文件指针移到文件的任何地方。文件刚刚被打开时,文件指针指向第一个字节,以后随着文件处理命令的执行而移动。二进制文件与随机文件一样,文件一旦打开,就可以同时进行读写。1.以二进方式打开文件在VB中以Binary模式生成或打开文件均为二进制文件,其格式为:Open文件标识ForBinaryAs#文件号由于以二进制模式读、写文件的记录长度恒为1,这里不需要指定记录长度。2.以二进制方式读写文件⑴与随机文件类似,在二进制操作模式中,仍然用Put语句向文件写数据。其格式为:Put[#]文件号,字节号,变量⑵按二进制方式读取文件数据可以用Get语句和Input函数。Get[#]文件号,字节号,变量变量名=Input(字节数,文件号)⑶定位文件的当前位置定位文件的当前位置,用Seek语句,位置用字节号指定,其具体格式为:Seek[#]文件号,字节号该语句将文件号指定的文件读写指针的当前位置,移到字节号指定的位置。还可以使用Seek函数获取文件指针的当前位置(字节号)。10.5常用的文件操作语句和函数1、FileCopy语句格式:FileCopysource,destination功能:复制一个文件说明(1)参数source和destination分别表示要复制的源文件名和目标文件名(2)FileCopy语句不能复制一个已打开的文件2、Kill语句格式:Killpathname功能:删除文件如:Kill*.txt(删除当前目录下所有”*.txt”文件)3、Name语句格式:NameoldpathnameAsnewpathname功能:重新命名一个文件或目录说明:(1)Name具有移动文件的功能,即重新命名文件并将其移动到一个不同的文件夹中(2)在oldpathname和newpathname中不能使用通配符(3)不能对一个已打开的文件使用Name语句。4、MkDir语句格式:MkDirpath功能:创建一个新的目录.5、RmDir语句格式:RmDirpath功能:删除一个已经存在的目录说明:RmDir不能删除一个含有文件的目录.如要删除,应该先使用Kill语句删除所有文件.6、ChDrive语句格式:ChDrivedrive功能:改变当前驱动器7、ChDir语句格式:ChDirpath功能:改变当前目录10.6文件系统控件文件系统控件有三种:驱动器列表框(DriveListBox)目录列表框(DirListBox)文件列表框(FileListBox)1、重要属性属性适用的控件说明DrivePathFileNamePattern目录和文件列表框文件列表框文件列表框驱动器列表框包含当前路径包含选定的文件名决定显示的文件类型包