QQ群讲义1--关于用VB的文件操作

这篇是在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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值