6.1文件和流
6.2菜单栏
6.3工具栏与状态栏
6.4实践检验第 6章 文件管理与菜单设计本章知识点:
文件和流的相关概念及操作
通用对话框的应用
菜单制作及应用
工具栏制作及应用第 6章 文件管理与菜单设计
6.1 文件和流
6.1.1 文件类型和操作根据数据的编码,及存储形式的不同,VB.NET提供了 3种文件访问模式:
-- 顺序访问模式。
-- 随机访问模式。
-- 二进制访问模式。
但不论是用哪种模式访问文件,基本操作步骤是相同的,一般都需要经过以下 3步完成。首先打开文件,如果文件不存在应先创建文件。当文件打开后,就可以对文件进行读或写操作了。当文件操作完毕,应该关闭文件,
如图 6-1所示 。
1 创建或 打开文件的 FileOpen方法对上述 3种文件访问模式,可以用 FileSystem.FileOpen 方法打开文件。
FileOpen 为打开的文件分配用于进行 I/O 操作的缓冲区并确定用于该缓冲区的访问模式。
1)格式
Public Shared Sub FileOpen ( _
FileNumber As Integer,_
FileName As String,_
Mode As OpenMode,_
<OptionalAttribute> Optional Access As OpenAccess =
OpenAccess.Default,_
<OptionalAttribute> Optional Share As OpenShare =
OpenShare.Default,_
<OptionalAttribute> Optional RecordLength As Integer = -1 _
)
2)参数说明
-- FileNumber:必选。任何有效的文件号。可使用 FreeFile 函数获取下一个可用的文件号。
-- FileName:必选。一个指定文件名的 String 表达式,其中可包含目录或文件夹以及驱动器。
-- Mode:必选。指示调用文件访问函数时如何打开文件。按顺序访问文件(如文本文件)时使用 Input,Output 和 Append;按二进制文件访问时使用 Binary ;按随机文件访问时使用 Random。
-- Access:可选。指示调用文件访问函数时如何打开文件。默认为可读取和写入访问,即 ReadWrite。 Default:允许读取和写入访问。这是默认设臵; Read:允许读取访问; ReadWrite:允许读取和写入访问; Write:
允许写入访问。
-- Share:可选。一个指定不允许其他进程对打开的文件所进行的操作。
默认为 Lock Read Write。 Default:这是默认值,即 LockReadWrite;
LockRead:其他进程无法读取该文件; LockReadWrite:其他进程无法读取或写入该文件; LockWrite:其他进程无法写入该文件; Shared:任何进程都可以读取或写入该文件。
-- RecordLength:可选。小于或等于 32,767(字节)的数字。对于为进行随机访问而打开的文件,此值是记录的长度。对于顺序文件,此值是缓冲的字符数。
3)示例以下举例说明,根据对文件的不同操作如何使用 FileOpen 方法的示例。
以 Input 模式打开进行读取操作处理的文件名为 TestFile的顺序文件。
FileOpen(1,"TESTFILE",OpenMode.Input)
' 加入对 TestFile文件进行读取访问处理的代码
FileClose(1) ' 关闭 TestFile文件以 Output 模式打开该文件,任何进程都可以写入该文件。
FileOpen(1,"TESTFILE",OpenMode.Output,OpenAccess.Default,
OpenShare.Shared)
'加入对 TestFile文件进行写入访问处理的代码,文件关闭前可以用另一种模式打开
FileClose(1)
以 Random 模式打开 TestFile随机文件进行读写操作,该文件含结构
Person 的记录。
Structure Person
<VBFixedString(30)> Dim Name As String
Dim ID As Integer
End Structure
Public Sub ExampleMethod()
' Len(Person)记录长度为 Name和 ID长度之和为 34。 Access,Share参数省略,但“,”不能省
FileOpen(1,"TESTFILE",OpenMode.Random,,,Len(Person))
'加入对 TestFile随机文件进行读写处理的代码
FileClose(1)
End Sub
以 Binary 模式打开进行只写操作处理的文件名为 TestFile的二进制文件。
FileOpen(1,"TESTFILE",OpenMode.Binary,OpenAccess.Write)
' 加入对 TestFile二进制文件进行写入访问处理的代码
FileClose(1)
以 Binary 模式打开该文件进行读取,其他进程无法读取该文件。
FileOpen(1,"TESTFILE",OpenMode.Binary,OpenAccess.Read,
OpenShare._ LockRead)
2 顺序文件 的读写顺序文件也就是普通的文本文件,文件里面的数据存取方式为顺序存取,
即数据是一个接一个地顺序写入文件中的。读数据时,也是一个接一个地顺序读出文件的。
按顺序访问文件时,无法更改其数据,可以读取数据、并追加新数据,
或用新数据改写。如果为了进行输入而打开该文件,即使不直接写入该文件,文件的内容也将被改写。
1)Write,WriteLine 函数 写操作要向顺序文件中写入内容,应以 Output或 Append方式打开,然后使用
Write,WriteLine 函数将数据写入文件中:
Public Sub Write( ByVal FileNumber As Integer,ByVal ParamArray
Output As Object )
Public Sub WriteLine( ByVal FileNumber As Integer,ByVal ParamArray
Output() As _ Object )
-- FileNumber:必选。包含任何有效文件号的 Integer 表达式。
-- Output:可选。要写入文件的一个或多个用逗号分隔的表达式。
将数据写入顺序文件。用 Write 写入的数据通常由 Input 从文件中读取。
2)LineInput,Input 方法读操作
-- FileSystem.LineInput 方法从打开的顺序文件中读取一行并将其赋值给一个 String 变量。
Public Shared Function LineInput (FileNumber As Integer ) As
String
LineInput 函数从文件中一次读取一个字符,直到它遇到回车符 ( Chr
( 13))或回车 /换行符 ( Chr( 13) + Chr( 10))序列为止。该函数跳过回车 /换行符序列,而不是将其附加到字符串中。
-- FileSystem.Input 方法读取打开的顺序文件中的数据,并将这些数据赋值给变量。
FileSystem.Input方法将磁盘文件中的数据读入变量中,它被重载,其语法如下:
FileSystem.Input (Int32,Boolean)
FileSystem.Input (Int32,Byte)
FileSystem.Input (Int32,Char)
FileSystem.Input (Int32,DateTime)
FileSystem.Input (Int32,Decimal)
Ot (Int32,Double)
FileSystem.Input (Int32,Int16)
FileSystem.Input (Int32,Int32)
FileSystem.Input (Int32,Int64)
FileSystem.Input (Int32,Object)
FileSystem.Input (Int32,Single)
FileSystem.Input (Int32,String)
-- 举例例 6-1 运用 Write 及 WriteLine 写 3行字符到当前目录下的 file.txt中,再分别用 Input和 LineInput分别读出 file.txt中的内容到文本框中显示,分析结果。
Private Sub button1_Click(ByVal eventSender As System.Object,ByVal
eventArgs As System.EventArgs) Handles button1.Click
Dim b,fname,nextline As String
Dim recordNumber As Integer
'用 Write 及 WriteLine写 3行数据到 file.txt文件中,如图 6-2所示:
fname = "file.txt"
FileOpen(1,fname,OpenMode.Output)
For recordNumber = 1 To 3 '循环 5次
nextline = "Name " & recordNumber '定义字符串
Write (1,nextline) '将字符串 nextline写入文件后不换行
WriteLine(1,recordNumber) '将整型数 recordNumber写入文件后再换行
Next
FileClose(1)
'用 Input读出 file.txt中的内容到文本框中显示,如图 6-3的前 3行:
TextBox1.Text = ""
FileClose(1)
FileOpen(1,fname,OpenMode.Input)
b = ""
Do Until EOF(1)
Input(1,nextline) '读一个字段到 nextline中
b = b & nextline & Chr(13) & Chr(10)
'将读出的字段连接到 b中并加 1个回车换行符
Loop
FileClose(1)
TextBox1.Text = b
'用 LineInput再读 file.txt中的内容到文本框中显示,如图 6-3的后 3行:
FileOpen(1,fname,OpenMode.Input)
b = ""
Do Until EOF(1)
nextline = LineInput(1) '读一行字符到
nextline中
b = b & nextline & Chr(13) & Chr(10)
'将读出的这行字符连接到 b中并加 1个回车换行符
Loop
FileClose(1)
TextBox1.Text = TextBox1.Text & b
End Sub
从本例输出的结果可以看出,Write 及 WriteLine可以写入不同类型的数据,Write写完后不换行,而 WriteLine写完后要换行。 Input和 LineInput可以读出不同类型的数据,Input读一个字段,LineInput读一行。
3 随机文件的读写随机文件是一种以记录形式组织数据的文件,其数据存储方式为随机存储,可以随意读写文件中的记录数据。但所有记录的长度必须相同
1) FileSystem.FilePut方法
FileSystem.FilePut 方法仅在 Random 和 Binary 模式中有效。该方法将变量中的数据写入磁盘文件中,它被重载,其语法如下:
FileSystem.FilePut (Int32,Boolean,Int64)
FileSystem.FilePut (Int32,Byte,Int64)
FileSystem.FilePut (Int32,Char,Int64)
FileSystem.FilePut (Int32,DateTime,Int64)
FileSystem.FilePut (Int32,Decimal,Int64)
FileSystem.FilePut (Int32,Double,Int64)
FileSystem.FilePut (Int32,Int16,Int64)
FileSystem.FilePut (Int32,Int32,Int64)
FileSystem.FilePut (Int32,Int64,Int64)
FileSystem.FilePut (Int32,Single,Int64)
FileSystem.FilePut (Int32,ValueType,Int64)
FileSystem.FilePut (Int32,Object,Object)
FileSystem.FilePut (Int32,String,Int64,Boolean)
FileSystem.FilePut (Int32,Array,Int64,Boolean,Boolean)
其中前 3个参数:
-- Int32:必选。任何有效的文件号。
-- Single等:必选。有效变量名,它包含写入磁盘的数据。
-- Int64:可选。开始写入处的记录号( Random 模式文件)或字节号
( Binary 模式文件)。
最后两个重载方法中的最后一个参数 Boolean,可选。仅在写入字符串时适用。指定是否将字符串的双字节字符串长度说明符写入文件中。默认值为 False。
最后一个重载方法中的第 4个参数 Boolean,可选。仅当写入数组时使用。
指定是否将数组视为动态数组,以及是否写入用于描述字符串长度的数组说明符。默认值为 False。
如果写入的变量是一个数组,则可以选择是否写入数组大小和维度的说明符。 Visual Basic 2005 默认情况下不写入说明符。若要写入说明符,可将 Boolean参数设臵为 True。在写入数组时,写入方式需要与读取数组的方式匹配,如果读取它时将利用说明符,则写入时需要同时写入说明符。
该说明符指定数组的秩、大小和每个秩的下限。其长度等于 2 加上维数的
8 倍:( 2 + 8 * NumberOfDimensions)。 FileOpen函数中的
RecordLength 子句指定的记录长度必须大于或等于写入数组数据和数组说明符所需的全部字节数的总和。
2) FileSystem.FileGet 方法
FileSystem.FileGet 方法将打开的磁盘文件中的数据读取到变量中。
FileGet 方法的重载列表与上述 FilePut 方法一样,只是读而已。
3) 举例例 6-2 利用随机文件保存员工的成绩,可以输入员工的编号( ID)、
姓名( Name)以及月薪。
建立应用程序用户界面与设臵对象属性。建立 4个 Label,3个 TextBox、
2个 Button控件,界面如图 6-4所示。
编写程序代码如下:
' 定义 Person结构及其全局变量 Employee
Structure Person
Public ID As Integer
Public MonthlySalary As Decimal
<VBFixedString(8)> Public Name As String
End Structure
Public Employee As Person
Public Position As Long = 0?记录位臵变量
‘写入文件
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Button1.Click
Dim RecLength As Long
Position += 1
RecLength = Len(Employee.MonthlySalary)
RecLength = Len(Employee)
FileOpen(1,"MYFILE.DAT",4,,,RecLength)
Employee.ID = Val(TextBox1.Text)
Employee.Name = TextBox2.Text
Employee.MonthlySalary = Val(TextBox3.Text)
FilePut(1,Employee,Position)
FileClose(1)
End Sub
从文件读出
Private Sub Button2_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles Button2.Click
Dim FileNum As Integer,i,sum,RecLength As Long
RecLength = Len(Employee)
FileNum = FreeFile()
FileOpen(FileNum,"MYFILE.DAT",OpenMode.Random,,,
RecLength)
sum = LOF(FileNum) / RecLength
For i = 1 To sum
FileGet(FileNum,Employee,i)
Label4.Text &= Employee.ID & Employee.Name &
Employee.MonthlySalary & Chr(10)
Next
FileClose(FileNum)
End Sub
程序运行的结果如图 6-5所示。
4 二进制文件二进制文件是一种以二进制方式编码和保存数据的文件,
对于以 Binary(二进制)模式打开的文件,大多数 Random 模式规则都适用,只有少数例外。如:
FileOpen 函数中的 RecordLength 子句没有任何作用。 FilePut 连续向磁盘中写入所有变量,即:记录之间没有空白。
对于结构中数组以外的任何数组,FilePut 都只写入数据。未写入任何说明符。
FilePut 写入不是结构元素且不带两个字节的长度说明符的变长字符串。
写入的字节数等于字符串中的字符数。例如,下面的语句将 11个字节写入 1
号文件。
Dim hello As String = "Hello World"
FilePut(1,hello)
下例使用 FilePut 函数将 3条结构 Person 的记录被写入文件:
Structure Person
Public ID As Integer
Public Name As String
End Structure
Sub WriteData()
Dim PatientRecord As Person
Dim recordNumber As Integer
FileOpen(1," TESTFILE.txt",OpenMode.Binary) '以 Binary
模式打开的文件
For recordNumber = 1 To 3 '循环 5次
PatientRecord.ID = recordNumber '定义 ID
PatientRecord.Name = "Name " & recordNumber '定义字符串
FilePut(1,PatientRecord) '将记录写入文件
Next
FileClose(1) '关闭文件
End Sub
6.1.2 流的概念及其操作在,NET Framework中进行所有的输入和输出都可以用流。流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介。除文件流之外也存在多种流。例如,还存在网络流、内存流和磁带流等。
流的操作一般涉及 3个基本方法:
读取流:读取是从后备存储器到内存(如字节数组)的数据传输。
写入流:写入是从内存到后备存储器的数据传输。
查找流:查找是对后备存储器内的当前位臵进行查询和修改。
其中查找功能取决于流的存储区类型。例如,网络流没有当前位臵的统一概念,因此一般不支持查找。
1 字节流字节流属于最基本的 I/O流,因为它们只用来读写字节。字节本身并没有它们所代表的类型信息,文本文件和二进制文件数据流经常包装一个底层的字节流。
1)Stream类
Stream类是所有字节流的基类,它定义了用来读写字节数据的基本方法。
FileStream,BufferedStream和 MemoryStream类扩展了 Stream类,使之增加了一些附加的功能。
Stream类的共有属性及公共方法,如表 6-1、表 6-2所示。
2)BufferedStream 类缓冲区是内存中的字节块,用于缓存数据。 BufferedStream类用一个缓冲区来存放一个字节流,数据在被发送到最终目的地之前被读取或写入缓冲区。从而减少对操作系统的调用次数。因此,缓冲区可提高读取和写入的性能。尽管使用缓冲区可进行读取或写入,但不能同时进行这两种操作。
BufferedStream的 Read和 Write方法自动维护缓冲区。
BufferedStream 可使用 BinaryReader 和 BinaryWriter 读取和写入其他数据类型。如果读写的数据大小始终大于缓冲区的大小,那么
BufferedStream 可能甚至无法分配内部缓冲区。如果需要执行一系列读取或写入操作,而很少在读与写之间进行切换,则 BufferedStream 也可在共享缓冲区中进行。
3)MemoryStream 类
MemoryStream 类创建内存存储区而不是磁盘。 MemoryStream 封装以无符号字节数组形式存储的数据,该数组在创建 MemoryStream 对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。
流的当前位臵是指将要读取或写入操作信息的首地址。当前位臵可以通过 Seek 方法读取或设臵。在创建 MemoryStream 的新实例时,当前位臵设为零。
4) FileStream 类
FileStream类把一个输入或输出流与一个文件建立关联,这可以使用户对文件进行读写操作。 FileStream类缓存输入和输出,以获得更好的性能。
使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作。
读写操作可以指定为同步或异步操作。
FileStream 对象支持使用 Seek方法对文件进行随机访问。 Seek 允许将读取 /写入位臵移动到文件中的任意位臵。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位臵或结尾,分别由 SeekOrigin列举的 3个成员表示:
-- Begin:指定流的开头。
-- Current:指定流内的当前位臵。
-- End:指定流的结尾。
5) Seek 方法格式:
Function Seek ( offset As Integer,rigin As SeekOrigin) As Long
说明:
-- Offset:相对于 origin 的字节偏移量。
-- origin,SeekOrigin 的一个字段,指示获取新位臵所依据的参考点。
例如:
<StreamObject>.Seek(0,SeekOrigin.Begin)
BufferedStream,MemoryStream,FileStream类的公共属性与方法都与
Stream类相似,只不过在功能上有了扩展,这里不再详述。
2 字符流读写文本文件相关的字符流类有 6个,它们是 TextWriter,TextReader,
StreamWriter、,StreamReader,StringWriter和 StringReader类。
StreamWriter和 StringWriter类是 TextWriter的派生类,StreamReader和
StringReader类是 TextReader的派生类。 TextWriter和 TextReader类提供了它们派生类使用的公共 I/O功能的抽象类。 StreamWriter和 StreamReader类与底层的字节流或文件相关,它们定义了读取或写入字符、字符串的方法。
本节主要介绍这两个类的使用。
1) StreamWriter类
StreamWriter类实现了 TextWriter,使其以种特定的编码向流中写入字符,默认编码为 UTF-8。用 StreamWriter类创建的文本文件的头部都有 3个字节顺序标记来识别编码方案。 UTF-8 可以正确处理所有的 Unicode 字符,
并在操作系统的本地化版本上产生一致的结果。
编码是一个将一组 Unicode 字符转换为一个字节序列的过程。解码是一个反向操作过程,即将一个编码字节序列转换为一组 Unicode 字符。
Unicode 标准为所有支持脚本中的每个字符分配一个码位(一个数字)。
Unicode 转换格式 ( UTF)是一种码位编码方式。 Unicode 标准 3.2 版使用下列 UTF:
-- UTF-8,它将每个码位表示为一个由 1至 4个字节组成的序列。
-- UTF-16,它将每个码位表示为一个由 1至 2个 16位整数组成的序列。
-- UTF-32,它将每个码位表示为一个 32位整数。
有关 Unicode 编码、字节顺序和字节顺序标记的更多信息,请参见
www.unicode.org 上的,The Unicode Standard”( Unicode 标准)部分。
StreamWriter类共有 5个属性,如表 6-3所示。
StreamWriter 构造函数的重载方法如表 6-4所示。
StreamWriter的常用公共方法如表 6-5所示。
2)StreamReader类
StreamReader类与 StreamWriter类有许多相似之处,如在类的属性、方法及构造函数的重载方法上都很相似,不同的是一个读而另一个是写。为此,不再讲述。
StreamReader类可以将一种特定的编码从字节流中读出字符。默认编码为 UTF-8。
用 CurrentEncoding属性可以获取当前 StreamReader正在使用的当前字符编码。 Read()方法用来读取输入流中的下一个字符或下一组字符;
ReadLine()方法是从当前流中读取一行字符并将数据作为字符串返回;
ReadToEnd()方法可以从流的当前位臵到末尾读取流。
StringReader类实现了从字符串进行读取的 TextReader。它与一个 String
而不是一个文件或底层字节流建立关联。
3)举例例 6-3 向默认目录下 TestFile.txt文件写入几行文本信息。
Imports System.IO
Module StreamWrite
Public Sub Main()
Dim sw As StreamWriter = New StreamWriter("TestFile.txt")
sw.Write("This is the ")
sw.WriteLine("header for the file.")
sw.WriteLine("-------------------")
sw.Write("The date is,")
sw.WriteLine(DateTime.Now)
sw.Close()
End Sub
End Module
用记事本打开 TestFile.txt文件,其内容及格式如图 6-6所示。
若要将 TestFile.txt文件的内容全部读出,可通过下列程序实现。
Sub ReadTextFromFile()
Dim file As New System.IO.StreamReader("TestFile.txt")
Dim words As String = file.ReadToEnd()
Console.WriteLine(words)
file.Close()
End Sub
输出效果如图 6-7 所示。
下例语句可以从文件中读取一行,然后将每行文本输出到控制台。
Dim file As New System.IO.StreamReader("c:\test.txt")
Dim oneLine As String
oneLine = file.ReadLine()
While (oneLine <> "")
Console.WriteLine(oneLine)
oneLine = file.ReadLine()
End While
file.Close()
6.1.3 文件系统操作对文件系统的操作,主要涉及这几个类,FileSystemInfo类,Directory
类,FileInfo类,DirectoryInfo类,Path类以及 File类。
1 File类
File类是经常用到的类,它提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream对象。 File类的所有方法都是静态的,
因而无需具有文件的实例就可被调用。所有的方法在开始执行前都要执行一次安全检查。
F1le类的公共方法见如表 6-6所示。
下面具体介绍 —些常用方法的使用。
1) Copy()方法
Copy ()方法把现有文件复制一个新文件,它被重载。
语法格式:
Public Shared Sub Copy ( sourceFileName As String,destFileName As
String )
Public Shared Sub Copy (sourceFileName As String,destFileName As
String,overwrite As _ Boolean)
参数说明:
-- sourceFileName:要复制的文件。
-- destFileName:目标文件的名称。不能是目录。
-- overwrite,如果可以改写目标文件,则为 true;否则为 false。
允许 sourceFileName 和 destFileName 参数指定相对或绝对路径信息。
相对路径信息被解释为相对于当前工作目录。
2) Delete ()方法删除指定的文件。如果指定的文件不存在,则不引发异常。
Public Shared Sub Delete (path As String)
参数说明:
path,要删除的文件的名称。允许 path 参数指定相对或绝对路径信息。
相对路径信息被解释为相对于当前工作目录。
3) Open()方法打开指定路径上的 FileStream,具有指定的读、写或读 /写访问模式以及指定的共享选项。它共有 3个重载方法。
Public Shared Function Open (path As String,mode As FileMode) As
FileStream
Public Shared Function Open (path As String,mode As FileMode,_
access As FileAccess,) As FileStream
Public Shared Function Open (path As String,mode As FileMode,_
access As FileAccess,share As FileShare ) As FileStream
参数说明:
-- path:要打开的文件。允许 path 参数指定相对或绝对路径信息。相对路径信息被解释为相对于当前工作目录。
-- mode,FileMode 值,用于指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容。
-- access,FileAccess 值,指定可以对文件执行的操作。
-- share,FileShare 值,它指定其他线程所具有的对该文件的访问类型。
返回值:
指定路径上的 FileStream,具有指定的读、写或读 /写访问模式以及指定的共享选项。
4) Replace()方法用其他文件的内容替换指定文件的内容,删除原始文件,并创建被替换文件的备份和(可选)忽略合并错误,它被重载。
语法格式:
Public Shared Sub Replace (sourceFileName As String,
destinationFileName As String,_
destinationBackupFileName As String)
Public Shared Sub Replace ( sourceFileName As String,
destinationFileName As String,_
destinationBackupFileName As String,ignoreMetadataErrors As
Boolean)
参数说明:
-- sourceFileName,替换由 destinationFileName,指定的文件名。
-- destinationFileName,替换文件的名称。
-- destinationBackupFileName:备份文件的名称。
-- ignoreMetadataErrors:如果忽略替换合并错误,则为 true,否则为
false。
5) 示例下面的程序示例了对 File类一些方法的使用。
Imports System.IO
Public Class FileDemoTest
Public Shared Sub Main()
Dim SourceFileName As String = "File.TXT"
Dim DestFileName1 As String = "C:\TEMP\File.BAK"
Dim DestFileName2 As String = "C:\TEMP\File.txt"
If File.Exists(DestFileName1) Then
File.Delete(DestFileName1)
End If
File.Copy(SourceFileName,DestFileName1)
File.Move(SourceFileName,DestFileName2)
End Sub
End Class
2 FileSystemInfo类
FileSystemInfo类包含文件和目录操作所有的方法,是 FileInfo和
DirectoryInfo的基类。 FileSystemInfo对象可以表示文件或目录,所以可以作为 FileInfo或 DirectoryInfo对象的基础。当分析许多文件和目录时,一般使用该基类。
FileSystemInfo类的主要属性如表 6-7 所示。
3 Directory类
Directory 类用于典型操作,如移动、创建和删除目录,也可将
Directory 类用于获取和设臵与目录的创建、访问及写入操作相关的日期时间信息。其主要的公共方法如表 6-8所示。
所有的 Directory 方法都是静态的,如果只想执行一个操作,那么使用
Directory 方法的效率比较高。从另一方面来说,静态会对所用方法都执行安全检查,如果打算多次重用某个对象,可考虑改用 DirectoryInfo 的相应实例方法,因为并不总是需要安全检查在接受路径作为输入字符串的成员中,路径必须是正确的,否则将引发异常。
在接受路径的成员中,路径可以是指文件或仅是目录。指定路径也可以是相对路径或者服务器和共享名称的统一命名约定 ( UNC)路径。例如,
以下都是可接受的路径:
--,c,\MyDir”
--,MyDir\MySubDir”
--,\\MyServer\MyShare”
4 FileInfo和 DirectoryInfo类
FileInfo类提供创建、复制、删除、移动和打开文件的实例方法。
许多 FileInfo 方法在您创建或打开文件时返回其他 I/O 类型。可以使用这些其他类型进一步操作文件。有关更多信息,请参见特定的 FileInfo 成员,如 Open,OpenRead,OpenText,CreateText 或 Create。
如果打算多次重用某个对象,可考虑使用 FileInfo 的实例方法,而不是
File 类的相应静态方法,因为并不总是需要安全检查。
在默认情况下,将向所有用户授予对新文件的完全读 /写访问权限。
DirectoryInfo 类用于创建、移动和枚举目录和子目录的实例方法。典型操作,如复制、移动、重命名、创建和删除目录。
如果打算多次重用某个对象,可考虑使用 DirectoryInfo 的实例方法,而不是 Directory 类的相应静态方法,因为并不总是需要安全检查。
6.2 菜单栏
Windows 应用程序中用户界面的一个至关重要的部分是菜单栏,因为命令通常在这里显示。通过菜单对各种命令按钮功能进行分组,使用户能够更加方便、直观地访问这些命令,为用户灵活操作应用程序提供了便捷的手段。
6.2.1 菜单的概念菜单由若干个命令、分隔条、子菜单标题等菜单项组成。
在实际的应用中,菜单可分为两种基本类型:下拉式菜单和上下文菜单。
下拉式菜单一般通过单击菜单栏中菜单标题(如“文件”、“编辑”等)
的方式打开,如图 6-8所示。上下文菜单(或称弹出式菜单)则通过用鼠标右键单击某一区域的方式打开,如图 6-9所示。
在“工具箱”中单击并打开“菜单和工具栏”选项卡展开选项卡中的控件项,其中
MenuStrip控件用来构建下拉菜单,如图 6-10
所示。 MenuStrip 控件表示窗体菜单结构的容器。
6.2.2 下拉菜单设计
VB.NET中提供了菜单设计器,通过菜单设计器就不仅能够设计下拉菜单,
也能够设计上下文菜单。下面是建立菜单的完整步骤:
( 1)启动 Visual Studio,Net。
( 2)选择菜单 【 文件 】 |【 新建项目 】 后,弹出“新建项目”对话框。
( 3)将“项目类型”设臵为,Visual Basic项目”。
( 4)将“模板”设臵为,Windows应用 程序,。
( 5)在“名称”文本框中输入“菜单编程”。
( 6)然后单击“确定”按钮,这样就创建了名称为“菜单编程”的项目 文件 。
( 7)把 Visual Studio,Net的当前窗口切换到,Form1.vb(设计)”窗体,并从“工具箱”中的“菜单和工具栏”选项卡中往 Form1窗体中拖入一个 MenuStrip组件,默认名称为,MenuStrip1”。
( 8)在如图 6-11( a)所示的“请在此处输入” 菜单录入文本框中,按由上至下顺序输入,文件,、“新建”、“保存”、“另存为”等,若在主菜单位臵点击右键弹出菜单如图 6-11( b)所示,表示在主菜单位臵上除了可以添加菜单项外,还可以添加组合框及文本框。
菜单项之间设立分隔线,可点击菜单录入文本框右侧的向下箭头,弹出如图 6-12( a)所示的菜单,选,Separator”菜单项即可。
这样一个简单的下拉菜单就完成了。如果用户的应用 程序 中还需要加入其他菜单,可以仿效上述方法,在如图 6-12( b)中的“请在此处输入”菜单录入文本框中输入相应的菜单名就可以了。
6.2.3 上下文菜单设计下面是上下文菜单设计的一般步骤:
( 1)在上述项目中,从“工具箱”中的“菜单和工具栏”选项卡中向
Form1窗体中拖入(或双击)一个 ContextMenuStrip组件,名称为
ContextMenuStrip1。
( 2)单击窗体下方的,ContextMenuStrip1”组件,在菜单栏出现上下文菜单设计器,如图 6-13( a)所示界面。
( 3)在图 6-13( a)所示的,ContextMenuStrip”下的“请在此处输入”
菜单录入文本框中,按由上至下顺序输入“拷贝( &C)”、“剪切
( &X)”、“粘贴( &V)”后,此时设计后的菜单如图 6-13( b)所示。
在 VB.NET中,&”号和 VB中的,&”符号所起的作用完全一致,作用是为菜单设定快捷键。
( 4)选定 Form1的属性选项卡,并设定 Form1的,ContextMenuStrip”的属性值为,ContextMenuStrip1”,从而将 Form1与 ContextMenuStrip1建立关联。
对于其他组件一般也都有,ContextMenuStrip”属性,只需把组件的
,ContextMenuStrip”属性值设臵为设计好的上下文菜单名称,这样当在此组件中单击鼠标右键,就会弹出对应的上下文菜单。
6.2.4 菜单的高级设置
1 隐藏菜单项隐藏菜单项是控制应用程序的用户界面和限制用户命令的一种方法。通常,希望在某种条件下某个菜单项不可用时隐藏该菜单,这能减少对用户的干扰。
对设臵菜单项的 Visible属性设臵为 False 的代码。
ToolStripMenuItem1.Visible = False
2 禁用菜单项根据条件需要,可启用或禁用菜单项。菜单项创建完后是默认启用的,
但是这可以通过 Enabled 属性进行调整。在设计模式下对该菜单项的“属性”窗口中设臵此属性,或者在代码中以编程方式设臵。
对设臵菜单项的 Enabled 属性设臵为 False 的代码。
ToolStripMenuItem1.Enabled = False
3 添加已选择标记根据功能需要,在启用某菜单项时,可以通过 Checked 属性标记该菜单项。当 Checked 属性值为 True时,该菜单项前显示已选择标记,√”,而
Checked 属性值为 False时,消除该菜单项前的已选择标记。在设计模式下对该菜单项的“属性”窗口中设臵此属性,或者在代码中以编程方式设臵。
ToolStripMenuItem1,Checked = True
在 Windows 窗体应用程序中可使用 ToolStrip控件(或类)来创建工具栏,这些工具栏具有 Windows XP,Office,Internet Explorer 或自定义的外观和行为。 ToolStrip 控件也提供丰富的设计时体验,包括就地激活和编辑、自定义布局等功能。
ToolStrip 是 ToolStripButton,ToolStripComboBox、
ToolStripSplitButton,ToolStripLabel,ToolStripSeparator、
ToolStripDropDownButton,ToolStripProgressBar 和 ToolStripTextBox 对象的容器,如图 6-14中菜单所示。
ToolStripButton:表示包含文本和图像的可选的 ToolStripItem。
可使用 ToolStripButton创建一个支持文本和图像的工具栏按钮。可使用
ToolStrip_ Item.ImageAlign和 ToolStripItem.TextAlign属性获取或设臵
ToolStripButton图像和文本的位臵。
6.3 工具栏与状态栏
6.3.1 创建工具栏在“工具箱”中单击“菜单和工具栏”选项卡展开选项卡中的控件项,
其中 ToolStrip控件用来构建工具栏,如图 6-10所示。 ToolStrip 控件表示窗体工具栏结构的容器。
VB.NET中提供了工具栏就地激活和编辑、自定义布局等功能。
下面是建立工具栏的完整步骤:
( 1)启动 Visual Studio,Net。
( 2)选择菜单 【 文件 】 |【 新建项目 】 后,弹出“新建项目”对话框。
( 3)将“项目类型”设臵为,Visual Basic项目”。
( 4)将“模板”设臵为,Windows应用 程序,。
( 5)在“名称”文本框中输入“工具栏编程”。
( 6)然后单击“确定”按钮,这样就创建了名称为“工具栏编程”的项目 文件 。
( 7)把 Visual Studio,Net的当前窗口切换到,Form1.vb(设计)”窗体,并从“工具箱”中的“菜单和工具栏”选项卡中双击 ToolStrip控件,
此时,窗体的上方加入了默认名称为,ToolStrip 1”的工具栏容器。
( 8)单击工具栏容器,弹出菜单如图 6-14所示,表示在工具栏容器中可添加的对象元素。选择,Button”(或双击工具栏容器)自动生成一个
“按钮图标”。
( 9)按钮添加完后,添加图标:右击需要添加图标的按钮后,弹出菜单如图 6-15所示,选择“设臵图像( M) …”,弹出“选择资源”对话框,
如图 6-16所示。
在“选择资源”对话框中,单击“导入 (M)…”按钮,可按提示选图标,
如图 6-17所示 。
双击按钮图标后,对应按钮图标的 Click事件过程的声明部分会自动显示在代码窗口中,如图 6-18所示。
6.3.2 创建状态栏
StatusStrip 控件可以显示正在 Form 上查看对象的相关信息、对象的组件或与该对象在应用程序中的操作相关的上下文信息。通常 StatusStrip 控件由 ToolStripStatusLabel 对象组成,每个这样的对象都可以显示文本、图标或同时显示这两者。 StatusStrip 重要的伴生类包括:
ToolStripDropDownButton,ToolStripSplitButton 和 ToolStripProgressBar
等控件,如表 6-9所示。
VB.NET中提供了 StatusStrip 的“项集合编辑器”用于添加、移除和重新排序 StatusStrip 的 ToolStripItem 控件,以及查看和设臵 StatusStrip 及
ToolStripItem 属性。
通过在设计器中右击 StatusStrip 控件并从快捷菜单中选择“编辑项”,
打开 StatusStrip 的“项集合编辑器”,如图 6-19所示。
单击该项以添加显示在下拉列表中的 ToolStripItem。可添加一个或多个下列控件:
-- ToolStripStatusLabel。
-- ToolStripProgressBar。
-- ToolStripDropDownButton。
-- ToolStripSplitButton。
添加上述控件后,就可以对其相关的属性进行读取和设臵,实现显示和查看 Form上的对象相关信息、及与该对象在应用程序中的操作相关的上下文信息,在此不在讲述。
6.3.3 举例本示例演示菜单及如何在 StatusStrip 控件中显示不同类型的信息。
1 建立应用程序用户界面与设臵对象属性窗体界面上添加一个 MenuStrip组件,1个 StatusStrip 控件,1个计时器控件 Timer,1个 Label 控件,一个 GroupBox 控件,4个 CheckBox 控件,其布局如图 6-20( a)所示,各控件的主要属性如表 6-10所示。
2 编写程序代码按照上述属性的设臵,对照图 6-20所示,添加下述过程代码。
Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles MyBase.Load
' 设臵应用程序窗体的标题。
status.Text = TextBox1.Text
dateLabel.Text = Today.ToShortDateString
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As
System.Object,ByVal e As System.EventArgs) Handles
CheckBox1.CheckedChanged
' 如果选择显示窗格的功能,则自动选择在状态栏上显示哪个窗格
GroupBox1.Enabled = CheckBox1.Checked
' 根据窗体上的复选框更改状态栏 Visible 属性
Me.status.Visible = CheckBox1.Checked
Me.dateLabel.Visible = CheckBox1.Checked
Me.progressBarStrip.Visible = CheckBox1.Checked
' 禁用计时器,所以进度栏停止前进
If ProgressBarCheckBox.Checked And CheckBox1.Checked Then
Timer1.Enabled = True
ElseIf Not CheckBox1.Checked Then
Timer1.Enabled = False
End If
End Sub
Private Sub ProgressBarCheckBox_CheckChanged(ByVal sender As
System.Object,ByVal e As System.EventArgs) Handles
ProgressBarCheckBox.CheckedChanged
' 如果不在状态栏上显示 progressbar,则禁用计时器
Timer1.Enabled = ProgressBarCheckBox.Checked
End Sub
Private Sub DateCheckBox_CheckChanged(ByVal sender As
System.Object,ByVal e As System.EventArgs) Handles
DateCheckBox.CheckedChanged
Me.dateLabel.Visible = DateCheckBox.Checked
End Sub
Private Sub TextCheckBox_CheckChanged(ByVal sender As
System.Object,ByVal e As System.EventArgs) Handles
TextCheckBox.CheckedChanged
status.Visible = TextCheckBox.Checked
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles TextBox1.TextChanged
' 更新状态栏文本
status.Text = TextBox1.Text
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object,ByVal e As
System.EventArgs) Handles Timer1.Tick
If Me.progressBarStrip.Value < progressBarStrip.Maximum Then
progressBarStrip.Increment(progressBarStrip.Step)
Else
progressBarStrip.Value = progressBarStrip.Minimum
End If
'刷新状态栏
Me.StatusStrip1.Invalidate()
End Sub
Private Sub fileStrip_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles fileStrip.Click
Me.Close()
End Sub
运行上述程序后界面如图 6-20( b)所示,请读者参照程序理解菜单及状态栏的使用,在此基础上,工具栏的使用也很类似。
理论巩固什么是流?流操作包括哪些方法?
VB.NET提供了哪三种文件访问模式?
顺序文件和随机文件的特点和操作方法分别是什么?
举例说明 File类的常用公共方法的用法。
试述文件操作的几种方法,各种方法的特点是什么?
如何进行菜单设计,有哪两种方法?
编程实现 Windows的记事本的主要功能,能够打开、保存、关闭文本文件。
在上题的基础上做出修改,加入工具栏,提供剪切、复制、粘贴功能。
在上题的基础上提供密码保护,要求可以自行设定、修改文本密码。
上机实战
( 1程序,实现 Windows记事本的主要功能。
( 2试编程实现一个学生信息管理系统,要求可以打开、保存、增加、
修改、删除学员的姓名、性别、年龄和学号数据。
6.4 实践检验