这篇是在VB程序设计的QQ群里讲座的讲义,2007年3月11日的
第一节:基础概念
文件者,计算机之本也,死生之道,信息存亡之地,故不可不查也。
咱们现在通常所说的文件指的是存在硬盘上的数据,即相对于内存所说的外存的形式之一(因为还有磁带,非常有幸,本人见过磁带),现在
C
语言系统中对于文件的处理采用的是流的概念,把文件看成是字符的集合,分为
ASCII
型和二进制两种,当然,计算机中的所有数据归根结底都是二进制形式存放的,但这个地方所说的
ASCII
型是进行了一次转换,成为一种中间方式。换句话说,二进制的方式就是在内存中使用时的方式,计算机看着顺眼;
ASCII
方式是进行了一次转换之后,咱们看着顺眼的方式,所以,什么时候采用什么方式也就很容易想到了。
另外,对于文件的处理,存在两种系统,缓冲与非缓冲方式,现在
C
语言系统采用的是缓冲的方式,就是系统自动为使用的文件开个区域,数据先存放到此处,待满员后送往硬盘,一般默认为
512
字节,在
C
语言中,这个数值是相对固定的,由编译器决定,和
VB
的有所不同。
插叙一段:随着历史的发展,很多专用的文件类型都有了专用的处理方式,最典型的就是数据库,对于数据库文件的操作,现在基本都是用中间件的方法进行操作,比如在
VB
和
ASP
中,从
RDO
,
DAO
,一直发展到现在流行的
ADO
和
ADO.Net
,在
JSP
中也有相关的数据组件,这些组件的主要功能就是封装了对于数据库文件格式的操作细节,用它们成功的实现了简便连接后,再用
SQL
的方式进行有关操作,因为
SQL
这种语言的运行方式比较特殊,有人称之为第四代编程语言,也就是直接告诉它干什么,而不需考虑如何实现,这和咱们现在看到的
C
和
VB
确实有很大的不同,因为这种语言的高度简洁,所以
ADO
之类的技术大大减轻了我们的负担,当然,现在偶尔还会看到
C
语言操作
FoxBase
数据库之类的程序,那种还是先分析格式,然后一个个记录的去提取的。关于数据库操作的基本知识,由咱们的数据库一流高手
168
完成,今日到此为止,不再多说,今天主要要说的还是相对原始的和格式有关的操作。
到了
VB
中,引入了记录的概念(这个很可能是参考数据库得出的方法),既而有了顺序文件和随机文件的分别,顺序文件的访问方式是依次处理,随机文件则可以自己定位。
VB
中的文件打开语句和
C
语言的极为相似,后续的参数决定了这个语句还可以创建新文件,而且在参数中还指定了有关锁定的控制,大大方便了有关的操作,另外,
VB
的文件打开语句中还有个关于长度的参数,用来指定记录长度或缓冲区大小,在这里,这个数值是可以指定的,当然,默认值和
C
语言中的一致。
第二节:基本应用
C
语言中,每打开一个文件,创建的是一个文件类型的指针,到了
VB
当中,采用的是文件号的概念,
1
,
2
,
3
等,当然关闭的时候也用
Close #1
,
Close #2
这样的方式关闭,于是,就有了一个很重要的函数
FreeFile
。
参考
1
:多使用
FreeFile
取得文件号,而不是直接的
1
,
2
,
3
参考
2
:文件操作语句的一个简单应用,实现
168
上次说到的第二套打印方案
这个方法的根据就是Html实则也是文本文件,并且,其中的Html有关标记也可以直接以文本方式输出,所以,直接把有关数据记录按文本方式输出,生成Html文件即可。
这段代码选自本人实际项目:
If Right$(App.Path, 1) <> "/" Then
strFileName = App.Path & "/SYYSaveDocsWorkS/" & txtSSaveDoc.Text & ".htm"
Else
strFileName = App.Path & "SYYSaveDocsWorkS/" & txtSSaveDoc.Text & ".htm"
End If
先通过这一段生成文件名strFileName,用App.path的最后一个字符是否为“/”来区分当前程序是否被放到了根目录(必须承认,世界上还是有变态的人的存在)
iFlag = FreeFile() '
生成一个当前未使用的文件标号
Open strFileName For Output As #iFlag '
打开一个文件
Print #iFlag, "<Html>"
用上边这样的语句向文本文件中输入Html标记
以下用一个Do循环结构显示数据
Do While Not rsWorkS.EOF
'
显示数据部分********************
Print #iFlag, "<TR>"
'
显示姓名
Print #iFlag, "<TD>"
Print #iFlag, rsWorkS("Name")
Print #iFlag, "</TD>"
'
以下用类似语句显示其他数据,详见程序代码
Print #iFlag, "</TR>"
rsWorkS.MoveNext
Loop
其中 Print #iFlag, rsWorkS("Name") 是向文件中输入数据库的内容
这样,就生成了一个html的文件,双击打开,调用IE进行打印。
参考3:一个简单的判断程序使用次数的通用过程
'
判断是否到注册期限的通用过程
'intDeadLine
可能返回值为0,1,2,3
'0
表示判断文件不存在程序初次运行
'1
表示已通过验证
'2
表示程序已到限定使用次数
'3
表示程序未到限定次数
Public Function intDeadLine(ByVal strRegFile As String) As Integer
Dim intFlag As Integer '
临时文件号
Dim intCount As Integer '
总使用次数
Dim bolReg As Boolean '
声明是否已通过验证的变量
intFlag = FreeFile() '
设置一文件号
On Error Resume Next
Open strRegFile For Random As #intFlag Len = 4
If err.Number = 53 Then
'
若文件不存在,则创建文件并写入初始内容
Put #intFlag, 1, False
Put #intFlag, 2, 1
Close #intFlag
intDeadLine = 0
Else
'
确认文件存在后,进行如下操作
Get #intFlag, 1, bolReg '
确定是否需验证
Get #intFlag, 2, intCount '
程序运行次数
If bolReg = True Then
Close #intFlag
intDeadLine = 1
Else
If intCount >= 5 Then
'
决定使用次数
Close #intFlag
intDeadLine = 2
Else
intCount = intCount + 1
Put #intFlag, 1, bolReg
Put #intFlag, 2, intCount
Close #intFlag
intDeadLine = 3
End If
End If
End If
End Function
参考4:操作ini文件
Ini
文件是16位时代很常见的配置文件,但现在仍然有很多程序使用,用记事本就可以打开,但是它的操作想要用VB实现则不像想像中的那么容易,需要调用API函数;其实,好多配置信息自己写个文本文件,扩展名随意定制一个未尝不可,不过作为一个摆酷的方式,练练ini的使用也不错。
操作ini文件的API是如下两个:WritePrivateProfileString和GetPrivateProfileString,可以在API的文本浏览器或手册中找到,然后复制,一般为了方便起见,可以把读写操作作成两个通用过程
如下代码是写的过程:
Private Sub WriteToIni(ByVal Filename As String, ByVal Section As String, ByVal Key As String, ByVal Value As String)
Dim buff As String * 128
buff = Value + Chr(0)
WritePrivateProfileString Section, Key, buff, Filename
End Sub
下边的代码是读的通用过程:
Private Function ReadFromIni(ByVal Filename As String,ByVal Section As String, ByVal Key As String) As String
Dim i As Long
Dim buff As String * 128
GetPrivateProfileString Section, Key, "", buff, 128,Filename,
i = InStr(buff, Chr(0))
ReadFromIni = Trim(Left(buff, i - 1))
End Function
写INI文件的过程
Dim Counter As Long
For Counter=1 To 4
Call WriteToIni(App.Path & "/Options.ini", "Test", "Name" & Counter, "Value" & Counter)
Next Counter
生成的Options.ini内容如下:
[Test]
Name1=Value1
Name2=Value2
Name3=Value3
Name4=Value4
读INI文件
Dim Counter As Long
Dim Value(4) As String
For Counter=1 To 4
Value(Counter-1)=ReadFromIni(App.Path & "/Options.ini", "Test", "Name" & Counter)
Next Counter
参考4:资源文件的使用
各位使用VB的弟兄可能都遇到过多个图片需要组织在一起的问题,解决这个问题的一个方案就是资源文件。
所谓资源文件,就是指将在程序运行时用到的资源集中在一起的一个文件。一个资源文件可以包括文字(TEXT),位图(BITMAP),图标(ICON)等,并且在程序中调用时可以不指明路径,这就简化了程序的编写并减少了发生错误的可能,在汇编和C的SDK写Windows程序时,资源文件的使用几乎成为家常便饭,但VB有时也会用到,故在此提及。
现在,某工程运行后,要求点击【未来】按钮时中间图像将依次变换为夏、秋、冬、春……点击【从前】按钮则以相反顺序转动图片。
首先建立春、夏、秋、冬四幅位图,均以.BMP格式保存在C:/TEST/下。然后打开记事本或其它文本编辑器编写资源文件,
内容如下:
100 bitmap spring.bmp
200 bitmap summer.bmp
300 bitmap autumn.bmp
400 bitmap winter.bmp
其中数字表示此项的ID号码,此号码很重要,它是调用的标记,BITMAP表示以位图方式保存,最后的部分是实际的文件名,将此文件保存为TEST.RC。
然后要编译资源文件,在C:/Visual Basic/Wizards目录下可以找到RC.EXE文件(有时找不到,到安装盘上看看),在命令行方式到刚才保存那个rc文件的目录,然后rc /r test.rc(键入rc /?会显示帮助),在编译成功后在C:/TEST/中发现增加了一个名为TEST.RES的文件(这才是可以添加到程序中的真正的资源文件)。
完成了上面的工作,接下来就可以编写工程了。首先建立一个Image控件img和两个Command控件cmdc、cmdw。然后建立一个时钟控件,设其Interval属性为1000。最后在[通用]中声明一个名为iid的整形变量:
Dim iid As Integer
并初始化img和iid:
img.Picture=LoadResPicture(100,vbResBitmap)
iid=100
其中LoadResPicture(id,model)为从资源文件中调用图片的函数,100表示ID号为100的项,vbResBitmap为一常量,值为0,表示以位图方式打开。然后在两个Command控件中加入源程序代码。
最后在工程资源管理器中用鼠标右键单击选择 添加-->添加文件,加入TEST.RES。
按F5运行一下试试效果
完整源程序如下:
Option Explicit
Dim iid As Integer
Private Sub comc_Click()
iid = iid - 100
If iid < 100 Then iid = 400
img.Picture = LoadRespicture(iid.vbResBitmap)
End If
End Sub
Private Sub comw_Click()
iid = 100 + iid
If iid > 400 Then iid = 100
img.Picture = LoadResPicture(iid,vbResBitmap)
End If
End Sub
Private Sub Form_Load()
img.Picture = LoadResPicture(10O,vbResBitmap)
iid = 100
End Sub
Private Sub Timer1_Timer()
iid = 100 + iid
If iid > 400 Then iid = 100
img.Picture = LoadResPicture(iid,vbResBitmap)
End If
End Sub