1.文本文件的操作
此种方式是以行为单位进行读取的基本单位,主要应用的方法和函数有Open,Close,Line Input,FreeFile,EOF等。下面先简述其功能然后结合代码示例进行说明。
Open:顾名思义,它的作用是打开文件,换而言之打开某个文件就是获得某个的控制权,一般情况下当文件处于打开状态时只有打开者才能对它进行操作。打开文件时要指定一个整数作为文件号,以后的操作都是针对这个代号进行的,而不是针对文件名。文件号也叫句柄,在程序中一个文件号只能指向一个文件,不能出现两个文件同时具有相同句柄的情况。
Close:关闭文件,即释放文件的控制权。
Line Input:以行为单位取得文件内容,以行为单位是指从当前位置开始到下一个换行符为止的内容。换行符是Chr(13) & Chr(10)两个字节组成,VB中已定义了常量vbCrLf,可直接使用。要注意的是Line Input读取一行时会把行尾的换行符去掉,因此我们在读取每行内容时要记得补上换行符才能保持得到的内容与文件一致。
FreeFile:得到空闲的文件号,用这个函数取得文件号可以避免文件号的冲突。
例如:
Dim strFileName As String '文件名
Dim
lngHandle
As
Long
'
文件句柄
Dim
strAll
As
String
'
所读取的文本文件的所有内容
Dim
strLine
As
String
'
在循环中存放每行的内容
strFileName
=
"
c:\b.txt
"
'
获得文件的句柄
lngHandle
=
FreeFile()
'
For后面的参数表示以何种方式打开文件,Input是读取,Output是覆盖写入,Append是追加写入
Open strFileName
For
Input
As
lngHandle
'
循环直到文件尾
Do
While
Not
EOF(lngHandle)
'
每次读取一行存放在strLine变量中
Line Input #lngHandle, strLine
'
每次读取都把所读到的内容连接到strAll变量,由于Line Input去掉了换行符,所以这里补上
strAll
=
strAll
&
strLine
&
vbCrLf
Loop
'
显示得到的全部分内容
MsgBox
strAll, vbInformation
对文本文件的写入相对简单些,有三个步骤:打开文件,写入文本,关闭文件。
代码示例:
Dim
strFileName
As
String
'
文件名
Dim
lngHandle
As
Long
'
句柄
Dim
strWrite
As
String
'
要写入的文本内容
strFileName
=
"
c:\w.txt
"
lngHandle
=
FreeFile()
'
取得句柄
'
准备要写入的内容
strWrite
=
"
落日楼头,断鸿声里,江南游子。把吴钩看了,栏干拍遍,无人会、登临意。
"
Open strFileName
For
Output
As
lngHandle
'
打开文件
Print #lngHandle, strWrite
'
写入文本
Close lngHandle
'
关闭文件
MsgBox
"
写入完成。
"
, vbInformation
常用到的一个函数,用来写日志用:
Sub
setLog(str
As
String
)
'
---------
'
写日志
'
---------
Open App.Path
&
"
\log\
"
&
CStr
(
Date
)
&
"
_log.txt
"
For
Append
As
#
1
Write #
1
, str
Close #
1
End Sub
二进制文件的操作
所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,以BMP等图象文件为例,它们的文件头中存放了是何种图形格式、图象大小、调色板等信息,要显示图象时先读取文件头以获得文件的详细信息,然后再按其格式把图象内容显示出来。用二进制方式可以操作任何的文件,当然至关重要的一点是要清楚了解所操作文件的文件头结构。
VB中二进制文件操作主要应用的方法和函数有:Open,Close,Get,Put等。
Open:在For后面的打开模式要用Binary。
Close:关闭文件。
Get:在指定位置取得文件的内容,如果省略位置则从当前位置读取。
Put:在指定位置写入文件,如果省略位置参数就从当前位置写。
下面结合代码讲解二进制文件的操作。
下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的,非常简单,共8个字节(也就是两个长整型的长度),前4个字节存放第一个文件的长度,后4个字节存放第二个文件的长度。为了更直观地表达文件的结构,现假设有两个文件,第一个文件长度是100字节,第二个文件是200字节,那么合并后得到的文件应该是308字节。按顺序来看,文件的结构是:
4第一文件的长度
4第二文件的长度
100第一文件的二进制内容
200第二文件的二进制内容
除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。
‘实现文件的合并
Private
Sub
MergeFile()
Dim
strFileName1
As
String
'
第一个文件
Dim
strFileName2
As
String
'
第二个文件
Dim
strOutput
As
String
'
合并后的文件
Dim
aryContent()
As
Byte
'
用来读取文件的数组,每次读取前要重定义
strFileName1
=
"
c:\a.bmp
"
strFileName2
=
"
c:\b.bmp
"
strOutput
=
"
c:\out.bmp
"
'
注意下面三个Open语句都是用Binary模式打开的
Open strOutput
For
Binary
As
#
100
Open strFileName1
For
Binary
As
#
1
Open strFileName2
For
Binary
As
#
2
Put #
100
, , LOF(
1
)
'
取得第一文件的长度,并把它写入到合并文件的文件头中
Put #
100
, , LOF(
2
)
'
取得第二文件的长度,并写入到合并文件的文件头中
ReDim
aryContent(LOF(
1
)
-
1
)
'
重定义数组,为读取文件做准备
Get
#
1
, , aryContent()
'
取得第一文件的内容到数组
Put #
100
, , aryContent()
'
把第一文件的内容写到合并文件中
ReDim
aryContent(LOF(
2
)
-
1
)
Get
#
2
, , aryContent()
Put #
100
, , aryContent()
'
关闭文件
Close #
1
Close #
2
Close #
100
End Sub
实现文件的拆分
Private
Sub
SplitFile()
Dim
strFileName1
As
String
Dim
strFileName2
As
String
Dim
strFileSplit
As
String
Dim
aryContent()
As
Byte
Dim
lngLOF(
1
)
As
Long
'
存放从文件头取得的两个文件的长度
strFileName1
=
"
c:\a2.bmp
"
strFileName2
=
"
c:\b2.bmp
"
strFileSplit
=
"
c:\out.bmp
"
Open strFileSplit
For
Binary
As
#
100
Get
#
100
, , lngLOF(
0
)
'
取得第一文件的长度
Get
#
100
, , lngLOF(
1
)
'
第二文件的长度
Open strFileName1
For
Binary
As
#
1
Open strFileName2
For
Binary
As
#
2
ReDim
aryContent(lngLOF(
0
)
-
1
)
'
用第一文件的长度重定义数组,为读取第一文件做准备
Get
#
100
,
9
, aryContent()
'
从第9字节,即文件后面开始读取第一文件的内容
Put #
1
, , aryContent()
'
把取得的内容写入到拆分文件中
ReDim
aryContent(lngLOF(
1
)
-
1
)
Get
#
100
,
9
+
lngLOF(
0
)
+
1
, aryContent()
'
从第9字节再加上第一文件的长度处开始读取第二文件的内容,这里可以清楚地看到文件头的作用了
Put #
2
, , aryContent
Close #
1
Close #
2
Close #
100
MsgBox
"
拆分完成。
"
, vbInformation
文本文件由于没有格式所以它的读写都比较简单和直观,而用二进制操作文件时其实质就是对文件头的理解,如果不知道文件头的结构那就无法对文件进行处理了,知道了文件头所包含的信息后,对文件的操作其实就是按规则进行Get、Put罢了。