Visual Basic.Net中有三种访问文件系统的方法:第一种是使用 Visual Basic 运行时函数进行文件访问 (VB传统方式直接文件访问);第二种是通过.Net中的System.IO模型访问;第三种是通过文件系统对象模型FSO访问。
文件是存储在某种介质上数据的集合,就其本身来讲,文件只不过是磁盘上的一系列相关的数据字节。当应用程序访问文件时,它必须假定字节是否表示字符、数据记录、整数、字符串等。通过指定文件的访问类型来告诉应用程序假定什么内容。
Visual Basic 提供三种类型的文件访问:
1.顺序,用于在连续的块中读取和写入文本文件。
2.随机,用于读取和写入结构为固定长度记录的文本或二进制文件。
3.二进制,用于读取和写入任意结构的文件。
** 使用 Visual Basic 运行时函数进行文件访问 **
VB.Net保留了VB早期的直接文件访问的方式即通过一些相关的函数直接访问操作文件。 下表分别列出了三种直接文件访问类型的所有可用文件访问函数。
函数 ** **
|
顺序 ** **
|
随机 ** **
|
二进制 ** **
|
** 说明 **
---|---|---|---|---
FileOpen 函数
|
X
|
X
|
X
|
打开输入或输出文件
FileClose 函数
|
X
|
X
|
X
|
关闭对用 ** FileOpen ** 函数打开的文件
Input 函数
|
X
|
|
X
|
从打开的顺序文件中读取数据并将数据分配给变量。
InputString 函数
|
X
|
|
|
返回 ** String ** 值
LineInput 函数
|
X
|
|
|
从打开的顺序文件中读取一行数据并将它赋给 ** String ** 变量。
Print、Printline 函数
|
X
|
|
|
将格式化的显示数据写入顺序文件。
Write、WriteLine 函数
|
X
|
|
|
将数据写入顺序文件。
要对文件进行操作,首先要打开文件,使用 FileOpen函数。
示例:以 ** Output ** 模式共享方式打开C盘下的readme.txt文件。
** FileOpen( **
1, "c:\readme.txt", OpenMode.Output, OpenShare.Shared ** ) **
当操作文件结束后,需要关闭文件防止文件内容的丢失,此外需要重新打开文件时也需要关闭文件,用 FileClose函数, 关闭刚才打开的文件c :\readme.txt:
FileClose(1);
当以 input模式打开顺序文件时,要打开的文件必须已经存在,否则打开出错,以Output或Append模式打开一个不存在的文件时,FileOpen先创建该文件,然后打开。
其他的一些函数:
Dir 函数:返回表示匹配指定模式或文件属性的文件名、目录名或文件夹名的字符串或返回驱动器卷标的字符串。
EOF 函数:当到达以 Random 或顺序 Input 模式打开的文件尾时,返回 Boolean 值 True 。
** FileCopy 函数:复制文件 **
FileDateTime 函数:返回指示创建或最后修改文件的日期和时间的 Date 值。
FileLen 函数:返回以字节表示的指定文件长度的 Long 值。
FreeFile 函数:返回一个 Integer 值,表示可由 FileOpen 函数使用的下一个文件号。
GetAttr 函数:返回表示文件、目录或文件夹的属性的 FileAttribute 值。
Loc 函数:返回一个 Long 值,该值指定打开文件中当前的读/写位置。
LOF 函数:返回一个 Long 值,表示用 FileOpen 函数打开的文件的大小(以字节为单位)。
Seek 函数:返回一个 Long 值,指定用 FileOpen 函数打开的文件中的当前读/写位置,或设置用 FileOpen 函数打开的文件中的下一个读/写操作的位置。
SetAttr 函数:设置文件属性信息。
** 1、顺序文件的操作 **
** 从文件中读取字符串 **
有三个函数可以从顺序文件中读取字符串: Input,InputString和LineInput。
Input函数
从打开的顺序文件中读取数据并将数据分配给变量。
Public Sub Input( FileNumber As Integer, ByRef Value As Object)
其中参数 _ FileNumber为 _ 有效文件号; _ Value为 _ 被赋予从文件读取的值的变量,它不能为数组或对象变量。
下面的例子是一个写入和读取文本 example.txt的Hello,world!例子,新建一个控制台应用程序,写入下面的代码查看结果。
FileOpen(1, "c:\example.txt", OpenMode.Output)
Write(1, "Hello,")
Write(1, "World!")
FileClose(1)
Dim s As String
FileOpen(1, "c:\example.txt", OpenMode.Input)
Do While Not EOF(1)
Input(1, s)
Console.WriteLine(s)
Loop
FileClose(1)
InputString函数
返回 String 值,该值包含以 Input 或 Binary 模式打开的文件中的字符。
InputString ( ByVal FileNumber As Integer, ByVal CharCount As Integer ) As String
其中参数 FileNumber是有效文件号, CharCount是 指定要读取的字符个数的有效数值表达式。
与 Input 函数不同,InputString 函数返回它读取的所有字符,包括逗号、回车符、换行符、引号和前导空格等。对于以 Binary 访问模式打开的文件,如果试图在 EOF 返回 True 之前用InputString 函数读取整个文件,则会产生错误。在用 InputString 读取二进制文件时,用 LOF 和 Loc 函数代替 EOF 函数,而在使用 EOF 函数时则使用 FileGet 函数。
示例:
Dim s As String
FileOpen(1, " c:\example.txt ", OpenMode.Binary)
Do While Not EOF(1)
s = InputString(1, 9)
Console.WriteLine(s)
Loop
FileClose(1)
LineInput 函数:
从打开的顺序文件中读取一行数据并将它赋给 ** String ** 变量。
** Public Function ** LineInput ** (ByVal ** _ FileNumber _ ** As Integer) As String **
参数 FileNumber 是有效文件号。
此函数从文件一次读取一个字符,直到遇到回车符( ** Chr( ** 13 ) )或回车 – 换行符( ** Chr( ** 13 ) + Chr( 10 ) )为止。回车 – 换行序列被跳过而不是附加到字符字符串上。
示例:
Dim s As String
FileOpen(1, " c:\example.txt ", OpenMode.Binary)
Do While Not EOF(1)
s = LineInput(1)
Console.WriteLine(s)
Loop
FileClose(1)
** 把字符串写入文件 **
如果要向文件中写入数据,可以用 Print/PrintLine函数,如果要写入的数据是字符串或是数值,则可以用Write/WriteLine函数,要写文件,应该先将文件以Output或Append方式打开,然后菜可以使用Print函数或Write函数。
Print/PrintLine函数: 将格式化的显示数据写入顺序文件。
Public Sub Print( ByVal FileNumber As Integer, ByVal ParamArray _ Output() _ As Object)
Public Sub PrintLine( ByVal FileNumber As Integer, Val ParamArray _ Output() _ As Object )
其中参数 FileNumber 是有效文件号, Output 是要写入文件的零个或更多个用逗号分隔的表达式。
示例:
FileOpen(1, " c:\example.txt ", OpenMode.Output)
Printline(1)
Printline(1, ” Hello, ” )
Print(1,spc(4), ” World! ” )
FileClose(1)
Write/Writeline和print/printline类似
** 2.随机文件的操作 **
随机访问文件中的字节构成相同的一些记录,每个记录包含一个或多个字段,对于一个字段的记录对应于任一标准类型,随机访问文件中的所有记录都必须具有相同长度,如果实际字符串包含的字符少于将它写入其中的字符串元素的固定长度,则 Visual Basic 用空白(字符代码 32)填充记录中的尾随空格。如果该字符串长于字段大小,则 Visual Basic 截断它。
示例:用户定义数据类型:
Structure Person
Public ID As Integer
Public MonthlySalary As Decimal
1<vbfixedstring(15)> Public Name As String
2
3<vbfixedstring(2)> Public Sex As String
4
5End Structure
6
7其中 VBFixedString用于定义字符串为固定长度的字符串。
8
9在打开一个文件进行随机操作访问前,应该定义一个类型该类型对应该文件已包含或未包含的记录。
10
11**打开要进行随机访问的文件** :
12
13FileOpen 函数:FileOpen( _FileNumber_ , _FileName_ , OpenMode.Random, , , _RecordLength_ )
14
15_ FileNumber _ 和 _FileName_ 分别指定要打开的文件的编号和文件名。 _RecordLength_ 以字节为单位指定每条记录的大小。如果 _RecordLength_ 小于写入文件的记录的实际长度,则会生成错误。
16
17示例:打开随机访问的文件。
18
19Dim FileNum as Integer ,RecLength as Long, Aperson as Person
20
21‘ 计算记录的长度
22
23RecLength=Len(APerson)
24
25‘ 获得可用的文件号
26
27FileNum=FreeFile()
28
29‘ 打开文件
30
31FileOpen(FileNum, ” c:\example.txt ” ,OpenMode.random,,,Reclenght)
32
33打开文件之后就可以把记录读入变量中,使用 FileGet函数。
34
35示例:从文件中读取第一条记录
36
37Dim FileNum as Integer ,RecLength as Long, Aperson as Person
38
39RecLength=Len(APerson)
40
41FileNum=FreeFile()
42
43FileOpen(FileNum, ” c:\example.txt ” ,OpenMode.random,,,Reclenght)
44
45FileGet(FileNum,Aperson,1);
46
47Console.WriteLine(Aperson.Id)
48
49Console.WriteLine(Aperson.Name)
50
51Console.WriteLine(Aperson.Sex)
52
53Console.WriteLine(Aperson.MonthlySalary)
54
55FileClose(FileNum)
56
57**写入记录** :通过 FilePut函数来替换已经存在的记录或新增记录
58
59示例:写入五条记录到文件中:
60
61‘ 自定义数据类型
62
63Structure Person
64
65Public ID As Integer
66
67Public Name As String
68
69End Structure
70
71
72 Sub WriteData()
73
74
75 Dim MyRecord As Person
76
77
78 Dim recordNumber As Integer
79
80
81 ' 随机方式打开.
82
83
84 FileOpen(1, "C:\example.txt", OpenMode.Binary)
85
86
87 For recordNumber = 1 To 5 '
88
89
90 MyRecord.ID = recordNumber ' Define ID.
91
92
93 MyRecord.Name = "My Name" & recordNumber '创建一个字符串
94
95
96 FilePut(1, MyRecord) ' 写入文件
97
98
99 Next recordNumber
100
101
102 FileClose(1)
103
104
105 End Sub
106
107以上代码实现了随机访问的方式打开文件,并写入记录。
108
109** 二进制文件的操作 **
110
111打开要进行二进制访问的文件
112
113FileOpen(FileNumber, FileName, OpenMode.Binary)
114
115关闭要进行二进制访问的文件
116
117FileClose(FileNumber)
118
119如果保持较小的文件大小很重要,则采用二进制访问。因为二进制访问不要求固定长度的字段,所以类型声明可以省略字符串长度参数。这使得以通过生成变长记录来节省磁盘空间。使用二进制型访问的类型定义为:
120
121Structure Person
122
123dim ID As Integer
124
125dim Name As String
126
127dim MonthlySalary As Decimal
128
129dim Sex As String
130
131End Structure
132
133使用变长字段的二进制输入 /输出的缺点是无法随机访问记录,而必须按顺序访问它们才能了解每条记录的长度。仍可直接转到文件中的指定字节位置,但是如果字段是变长的,则不知道哪个记录位于哪个字节处。
134
135(部分翻译自MSDN)</vbfixedstring(2)></vbfixedstring(15)>