1、第8章 VB.NET 的文件操作,本章要点:学习VB.NET的文件系统知识学习流知识掌握对顺序文件、随机文件、二进制文件的基本操作方法学习FileSystemObject对象的使用方法,第8章 VB.NET 的文件操作,8.1文件的相关概念8.2 文件流的概念8.3文件操作函数8.4面向对象的文件操作方法8.5 心电图数据的简单分析和波形的实现,8.1文件的相关概念, 文件结构:为了有效的对数据进行处理,必须以某种特定的方式存放数据,这种特定的方式称为文件结构。 文件由记录(Record)组成,一个文件含一个以上的记录,记录是由一组相关的字段(Field)组成。字段也称域,由若干个字符组成,用
2、来表示一项数据。字段由字符(Character)组成,字符是构成文件的最基本单位。字符可以是数字、字母、特殊符号或单一字节。,2.文件种类:根据不同的分类标准,文件可以分为不同的类型。 根据数据性质,可分为程序文件和数据文件。 程序文件(Program File):这种文件存放的是可以由计算机执行的程序,包括源文件和可执行文件。 数据文件(Data File):数据文件用来存放普通的数据。, 根据文件的存取方式和结构,可以分为顺序文件和随机文件。 顺序文件(Sequential File):顺序文件的结构比较简单,文件中的记录一个接一个地存放。顺序文件不能灵活的对数据进行添加、删除和修改操作,
3、因此适合于有一定规律且不经常修改的数据。其优点在于占用空间少,容易使用。, 随机存取文件(Random Access Tile):又称直接存取文件,简称随机文件或直接文件,可按任意次序读写文件(按记录号访问记录) ,每个记录的长度必须相同。 在随机文件中可以同时进行读、写操作,因此能快速地查找和修改每个记录。其主要优点是数据的存储较为灵活、方便、快捷。对数据的添加、删除和修改容易。缺点在于占用的空间较大,数据组织结构较复杂。, 根据数据的编码方式,可以分为ASCII文件和二进制文件 ASCII文件:又称文本文件,它以ASCII方式保存文件。这种文件可以用字处理软件建立和修改(必须按纯文本文件保
4、存)。 二进制文件(Brinary File):这种文件是字节的集合,允许程序按所需的任何方式组织和访问数据。二进制文件不能用普通的字处理软件编辑,占空间较小。,8.2 文件流的概念,文件流的访问操作都是通过.Net中System.IO模型来实现。表8-1列出了System.IO名称空间中常用的类。,对流的操作有三类,如下:(1)读取:可以从流读取。读取是从流到数据结构(如字节数组)的数据传输。(2)写入:可以向流写入。写入是从数据源到流的数据传输。 (3)定位:流可以支持查找。查找是对流内的当前位置进行查询和修改。VB.NET框架具有强大的文件处理功能,表8-2列出了完成流文件操作的Syst
5、em.IO.File类中常用的成员函数。,1、顺序文件的操作 (1)顺序文件创建例如用打开文件对话框OpenFileDialog1的FileName属性获得文件的路径,然后用File类的OpenText方法建立一个StreamReader类的对象,代码如下:Dim dread as StreamReader=File.OpenText(OpenFileDialog1.FileName),下面代码给出用StreamReader类的构造函数建立StreamReader类的对象的方法:Public sr1 as StreamReader= New StreamReader(“文本文件的完整路径”)P
6、ublic sr2 as StreamReader= New StreamReader (“文本文件的完整路径”,Encoding),表8-3列出StreamReader类的常用方法。,(2)顺序文件的读取和写入例如:Dim bb As StreamReader = File.OpenText(c: File1.txt)X=bb.ReadLine代码中用File对象的OpenText方法打开文本文件,文本文件打开时被转换成文件流,存放到StreamReader对象实例bb中,然后用ReadLine方法对文件流进行读取。,例8-1:用StreamReader类从文本文件读取文本。Imports
7、SystemImports System.IOClass Test Public Shared Sub Main() Try 创建一个StreamReader类对象读取文本 Dim sr as StreamReader = New StreamReader(TestFile.txt) Dim line as String 一行行读取文本内容,直到文本结束 Do line = sr.ReadLine() Console.WriteLine(Line) Loop Until sr.Peek=-1 sr.Close() Catch E as Exception 输出出错信息. Console.Wri
8、teLine(The file could not be read:) Console.WriteLine(E.Message) End Try End SubEnd Class,(3)文件的关闭file.close(4)文件的删除 file.delete(文件存放位置)2、二进制文件的操作创建文件如下所示:Dim BR As New IO.BinaryReader(IO.File.OpenRead(path)Dim BW As New IO.BinaryWriter(IO.File.OpenWrite(path),例如:假设BW是一个已经初始化过的BinaryWriter对象,表示如何写一个
9、字符串、整数、双精度数字到文件:BW.WriteLine(A String)BW.WriteLine(12345)BW.WriteLine(123.456789999999)读回数据的时候,必须选择BinaryReader合适的Read方法:Dim s As String = BR.ReadString()Dim i As Int32 = BR.ReadInt32()Dim dbl As Double = BR.ReadDouble(),要对文件夹目录操作时,要用到Directory类中的成员。表8-4列出了完成目录操作的由System.IO.Directory类中常用的成员函数。,8.3文件
10、操作函数,表8-5列出了 Visual Basic .NET 中用于文件和目录操作各种函数的功能:,1.顺序文件的打开Visual Basic.NET用FileOpen函数打开一个文件。其格式为:FileOpen(文件号,文件名,方式,访问类型,共享类型,记录长度格式中各参数的含义如下: 文件号:必选 。 文件名:必选 。 方式:必选。用来指定文件的输入输出方式,其值为枚举类型OpenMode,包括下列成员:OpenMode.Output: 指定顺序输出方式。OpenMode.Input: 指定顺序输入方式。OpenMode.Append: 指定顺序输出方式。, 访问类型:可选。用来指定访问文
11、件的类型,其值为枚举类型OpenAccess,包括以下成员:OpenAccess.Default:打开读/写文件OpenAccess.Read:打开只读文件OpenAccess.Write:打开只写文件OpenAccess.ReadWrite:打开读/写文件 共享类型:可选。 包括以下成员:Default :共享, 同Shared。Shared :任何机器上的任何进程都可以对该文件进行读写操作。LockRead :不允许其他进程读该文件。只在没有其他Read访问类型的进程访问该文件时,才允许这种共享类型。LockWrite:不允许其他进程写这个文件。只在没有其他Write访问类型的进程访问该文
12、件时,才能使用这种共享类型。Lock Read Write:不允许其他进程读写这个文件。, 记录长度:可选。记录长度的值不能超过32767B。 示例如下:(1)以Output方式打开文件,并且设置为任何进程都可以对该文件进行读写操作;FileOpen(1,”filetest”,OpenMode.Output,OpenShare.shared)(2)以Input方式打开文件。FileOpen(1,”filetest”,OpenMode.Input)(3)以Binary方式打开文件FileOpen(1,”filetest”,OpenMode.Binary,OpenAccess.Read,OpenS
13、hare.LockRead),2、文件的关闭文件的读写操作结束后,应将文件关闭。这可以通过FileClose函数来实现。其格式为:FileClose(文件号)示例如下:FileClose(1),3.顺序文件的写操作(1)、Print函数和PrintLine函数格式:Print(文件号,Spc(n)|Tab(n)表达式表)PrintLine(文件号,Spc(n)|Tab(n)表达式表))Print函数的功能是:把数据写入文件。“文件号”的含义同前,数据被写入该文件号所代表的文件中。PrintLine函数与Print函数基本相同,唯一的区别是,Print不在行尾包含换行,而PrintLine在行尾
14、包含换行。,例如:FoleOpen(1,”c:tempOne.txt”,OpenMode.Output) 以输出的方式打开文件One.txtDim x,y As ShortDim S As String =Chr(13)&Chr(10)X=10Y=20Print(1,x) 把变量x的值入文件号为1的文件中Print(1,S) 写入一个空行Print(1,y) 把变量y的值入文件号为1的文件中PrintLine(1) 用PrintLine函数写入一个空行Print(1,”Hello EveryOne!”) 把字符串Hello EveryOne!写入文件代码执行后,文件One.txt的内容为:,1
15、020Hello EveryOne!(2)Tab函数格式:Tab(n)Tab函数把光标移到由参数n指定的位置,从这个位置开始输出信息。输出内容放在Tab函数后面,并用逗号隔开。例如:Print(1,Tab(10),”Ok”)在第10个位置输出字符串ok。,例8-2: 输出以下表格内容。,在窗体上加一个按钮button1,在按钮的click事件中添加以下代码:Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.ClickFileOpen(1, c:tempst
16、udent.txt, OpenMode.Output) 注意该文件路径必须存在Dim x, y As ShortPrint(1, TAB(2), 姓名, TAB(10), 年龄, TAB(16), 专业,TAB(24), 籍贯)PrintLine(1)PrintLine(1, TAB(2), 张三, TAB(10), 20, TAB(16), 计算机, _TAB(24), “上海”)Print(1, TAB(2), 李四, TAB(10), 18, TAB(16), 艺术, _TAB(24), “北京“)Print(1, TAB(2), 王五, TAB(10), 16, TAB(16), 数学
17、, _TAB(24), “天津”)FileClose(1)End Sub 程序运行后,单击按钮,上面的表格内容就会写入文件student.txt中。,(3)Spc函数格式:Spc(n)在Print的输出中,用Spc函数可以跳过n个空格。例如:Print(1,”Mike”,SPC(10),”Jack”)将输出”Mike”然后跳过10个空格在第11个位置输出”Jack”。(3)Space函数格式:Space(n)Space函数返回n个空格。 例如:Dim x as String X=”Mike”+Space(10)+”Jack”Print(1,x)输出结果和上面用Spc函数的结果一样。(4) Wr
18、ite函数和WriteLine函数格式:Write(文件号,表达式表)WriteLine(文件号,表达式表),例8-3:在磁盘上建立一个电话号码文件,存放学生姓名和学生的电话号码。程序如下:Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.ClickDim Name, Tel As StringFileOpen(1, c:tempStudentTel.txt, OpenMode.Output)Unit = InputBox(请输入学生姓名:)While U
19、Case(Name) OverTel = InputBox(请输入电话号码:)Write(1, Name, Tel)WriteLine(1)Unit = InputBox(请输入学生姓名:)End WhileFileClose(1)EndEnd Sub,4、顺序文件的读操作(1)Input函数格式:Input(文件号,变量)Input函数从一个顺序文件中读出数据项,并把这些数据项赋给程序变量。 例8-4:从键盘上输入3个学生的数据,存放到学生数据文件StudetList.txt中,然后用Input方法将文件中的内容其读到内存,并在输出窗口中显示出来。,Private Sub Button1_C
20、lick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.ClickStructure stuDim stname As StringDim num As IntegerDim age As IntegerDim addr As StringEnd StructurePrivate Sub Button1_Click(ByVal sender As Object,ByVal e As _System.EventArgs)Handles Button1.ClickDim CL As String = Chr
21、(13) & Chr(10)Static stud() As stuDim n, i As Shortn = InputBox(请输入学生人数:)FileOpen(1, d:tempstudent_List.txt, OpenMode.Output)ReDim stud(n)For i = 1 To nstud(i).stname = InputBox(请输入姓名:)stud(i).num = InputBox(请输入学号:)stud(i).age = InputBox(请输入年龄:)stud(i).addr = InputBox(请输入住址:),Write(1, stud(i).stname
22、, stud(i).num, stud(i).age, stud(i).addr)Write(1, CL) 在一行的尾部加上一个回车-换行Next iFileClose(1)End Sub读取文件StudenList.txt中的内容并输出Private Sub Button2_Click(ByVal sender As Object,ByVal e As _System.EventArgs)Handles Button1.ClickDim n, I, j As ShortDim S As String = Dim studInfo As StringDim CL As String = Chr
23、(13) & Chr(10)FileOpen(1, d:tempstudent_List.txt, OpenMode.Input)Debug.WriteLine()Debug.WriteLine(姓 名 & S & 学号 & S & 年龄 & S & 住址 & CL)Do While Not EOF(1),如果未到记录末尾,就用Input函数读入数据Input(1, studInfo)If studInfo CL ThenDebug.Write(studInfo & S)ElseDebug.Write(CL)End IfLoopDebug.WriteLine(CL)FileClose(1)En
24、d Sub,(2)LineInput函数LineInput函数从顺序文件中读取一个完整的行,并把它赋给一个字符串变量。格式:字符串变量=LineInput(文件号)例8-5:把一个磁盘文件的内容读到内存并在文本框中显示出来,然后把该文本框中的内容存入另一个磁盘文件。用写字板建立一个名为“libai.txt”的文件,存放在C盘的temp目录下,内容如下:乌夜啼黄云城边乌欲栖,归飞哑哑枝上啼。机中织锦秦川女,碧纱如烟隔窗语。停梭怅然忆远人,独宿孤房泪如雨。,Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System
25、.EventArgs) Handles MyBase.LoadDim Aspect, Whole As StringDim CL As String = Chr(13) + Chr(10)FileOpen(1, c:templibai.txt, OpenMode.Input)Do While Not EOF(1)Aspect = LineInput(1)Whole = Whole & Aspect & CLLoopTextBox1.Text = Whole$FileClose(1)FileOpen(1, c:templibai2.txt, OpenMode.Output)Print(1, Te
26、xtBox1.Text)FileClose(1)End Sub,(3)FileCopy函数FileCopy函数用于复制文件。其格式如下:Public Sub FileCopy( 源文件名, 目标文件名 )源文件名:必选项。String 表达式,指定要复制的文件名。包括源文件的目录或文件夹以及驱动器。 目标文件名: 必选项。String 表达式,指定目标文件名。Destination 可能包括目标文件的目录或文件夹以及驱动器。 例8-6:检查文件是否存在,如果存在,则使用 FileCopy 函数将其复制到新文件。Private Sub CopyFiles()Dim checkFile As St
27、ringcheckFile = Dir$(c:test.txt)If checkFile = test.txtFileCopy c:test.txt, c:new.txtEnd IfEnd Sub,5、随机文件的操作(1)随机文件的打开FileOpen()函数用于打开随机文件,语法如下:FileOpen(FileNumber ,FileName ,Mode As OpenMode,Access As OpenAccess,Share OpenShare ,RecordLength As Integer)参数:FileNumber: Integer型参数,指有效文件号,1511之间。FileNa
28、me: String参数指任何有效的路径和文件名。Mode : 文件打开模式,可设为 Input、Output、Append、Random和Binary。,Access: 可选参数,表示文件访问方式可以包含Read、Write和Read Write。Share: 可选参数,指文件共享方式可以包含Share、LockRead、LockWrite和Lock 。包括以下成员:Default : 共享, 同Shared。Shared : 任何机器上的任何进程都可以对该文件进行读写操作。LockRead : 不允许其他进程读该文件。只在没有其他Read访问类型的进程访问该文件时,才允许这种共享类型。Lo
29、ckWrite : 不允许其他进程写这个文件。只在没有其他Write访问类型的进程访问该文件时,才能使用这种共享类型。Lock Read Write :不允许其他进程读写这个文件。RecordLength:缓冲的字节数。例如打开一个随机文件,代码如下:FileOpen(1, myfile, OpenMode.Random),(2)随机文件的关闭用FileClose()函数关闭随机文件。语法:FileClose(ParamArray FileNumbers()As integer)参数:FileNumbers()表示当前文件号(3)随机文件的写入FilePut()函数可以将变量写入文件中。语法如
30、下:FilePut(FileNumber , Value ,RecordNumber As integer)参数:FileNumber : Integer型参数,指有效文件号,1511之间。Value : 有效变量,将其内容写入文件中。支持的类型有Object、Short、Integer、Single、Double、Byte、Boolean、String、Data和Array。RecordNumber:可选参数,指定要写的随机文件中的记录数或二进制文件中的字节数。,例如:Dim str As string=”beautiful girl!”FileOpen(1,”C:girl.txt”,Ope
31、nMode.OutPut)FilePut(1,str)FileClose(1)(4)随机文件的读取FileGet()函数可以从打开的文件中读取信息。语法如下:FileGet(FileNumber , Value ,RecordNumber As integer)参数:FileNumber:Integer型参数,指有效文件号,1511之间。Value: 有效变量,从文件中读取的内容存入此变量中。支持的类型有Object、ShortInteger、Single、Double、Byte、Boolean、String、Data和Array。RecordNumber: 可选参数,指定要写的随机文件中的记
32、录数或二进制文件中的字节数。例如:Dim g As stringFileOpen(1,”C:girl.txt”,OpenMode.InPut)FileGet(1,g)FileClose(1),6、文件指针文件指针的定位通过Seek函数来实现。其格式为:Seek(文件号,位置),8.4面向对象的文件操作方法,FSO 对象模型位于 Microsoft 脚本运行时类型库 (Scrrun.dll) 中,支持通过 TextStream 对象创建和操纵文本文件表8-6列出了 FSO 对象模型的基本组件,这些主题列出了适用于创建和操纵文件、驱动器及目录的属性和方法。,FSO对象常用方法,8.5 心电图数据的
33、简单分析和波形的实现,8.5.1 设计思路和主要步骤1.建立工程2.在窗体中添加一个Panel控件,设置其BorderStyle属性的值为Fixed3D,Size属性的值为(512,430)。3.在Panel控件中添加一个PictureBox控件,name属性设置为pic,Dock属性设置为Fill,Size属性设置为(508,426)。4.添加两个Button控件。Name属性分别设置为“btstart”、“btend”,Text属性分别设置为“start”、“exit”。,5.新建一个heart.txt文件,在文件中输入一个模拟的心电图数据,注意每行输入一个数字。文件存放在C盘根目录下。数
34、据如下:0, 0 ,5 ,3 ,-5 , -5 ,110 , -10 ,-5 ,-4 ,-3 , -2 , 0 ,5 , 10 ,12 , 10 , 5 , 0, -3 , -1 , 0 , 0 , 0,5 , 0 ,0 , 5,110 , -10 , -5 ,0 , 0 , 0 , 0 ,5 ,10 , 13 ,5 ,0,习题8什么是文件、记录、字段?请说出二进制文件、随机文件、顺序文件的区别。阅读下面两个函数,说出程序的功能。 Sub WriteData() Dim fs As FileStream fs = New FileStream(c:data.txt, FileMode.Open
35、OrCreate) Dim w As BinaryWriter = New BinaryWriter(fs) Dim i As Integer For i = 0 To 11 w.Write(i) Next w.Seek(0, SeekOrigin.Begin) w.Close() fs.Close() End Sub,Sub ReadData() Dim fs As FileStream fs = New FileStream(c:data.txt, FileMode.OpenOrCreate) 创建一个文件流 Dim r As BinaryReader = New BinaryReader
36、(fs) 将数据类型读作二进制类 r.BAseStream.Seek(0, SeekOrigin.Begin) 用基础流查找流的开头 Dim i As Integer For i = 0 To 11 Console.WriteLine(CStr(r.ReadInt32() 将当前行结束符 Next r.Close() fs.Close() End Sub创建一个由一些字符构成的顺序文件file1.txt。File对象中常用的方法有哪些,举例说明。常用Stream对象中常用的方法有哪些,举例说明。用递归算法实现一个全盘查找指定文件的例子,查找结果放在列表框中。用2种编程方法实现文件复制功能。编写一个程序,实现把文件从原始文件位置移动到新文件位置的操作。10面向对象文件的操作方法是什么?,