你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
利用VB实现对Windows资源管理器操作的自动评分
 

向伟忠

摘  要 本文提出对Windows资源管理器操作的自动评分的一种方法:利用VB调用API函数对文件属性操作的自动评分;利用VB错误捕获和错误处理机制判断文件或文件夹是否存在而对文件的复制、移动等操作的自动评分
关键词 API,错误捕获,错误处理,自动评分

    在计算机应用基础考试中,一般都是上机测试,这样才客观和准确,但如不能进行自动评分,那教师的改卷工作量将非常大并且评卷过程中主观性大,容易出错,为了减轻教师的工作量和评卷的准确,有必要实现自动评分。在上机测试中,Windows资源管理器操作主要是文件的操作:建立、删除、复制、移动、重命名、属性的更改、文件夹的建立,是考试的重点内容。利用VB调用Windows 的API函数读出目标文件或文件夹相关属性的值;利用VB的捕获错误及编写相应的处理程序可以判断目标文件或文件夹是否存在,就很容易判断各种操作是否正确。

一、API基础
    API (Application Program Interface,即Windows的应用程序编程接口) 是一系列的底层函数,是系统提供给用户用于进入操作系统核心,进行高级编程的途径。通过在Visual Basic应用程序中声明外部过程就能够访问Windows API(以及其它的外部DLLs)。在声明了过程之后,调用它的方法与调用Visual Basic自己的过程相同。要声明一个DLL过程,需要在代码窗口的“声明”部分增加一个Declare语句,如果该过程返回一个值,应将其声明为Function。例如:Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type,如果过程没有返回值,可将其声明为Sub。缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其他类型的模块中定义的DLL过程是模块私有的,必须在它们前面加上Private关键字,以示区分。特别提请注意的是,在32位的Visual Basic中过程名是区分大小写的。而在以前的16位版本中并不区分大小写。
二、VB错误捕获和错误处理机制
    在VB中当应用程序中产生错误时,会进行下述操作:应用程序搜索错误处理程序,并把控制权传递给错误处理程序。如果执行完错误处理程序,控制权返回产生错误的语句。
    利用VB的On Error 语句可以捕获出错语句,在捕获错误之后,就可以编写自己的应用程序采取适当行动来处理。On Error 语句语法:
On Error GoTo Line
在Line标号处写出错时执行的代码,最后退出错误处理程序
三、具体实现
    在评分系统中用VB编程实现Windows资源管理器操作的自动评分
    1.文件属性题目的自动评分
    Windows资源管理器中文件属性的值有很多,现以常见的属性值:只读、隐藏、存档来说明怎样利用API函数来实现自动评分。
    (1)声明API函数,声明公用函数
Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long

Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20

Type WIN32_FIND_DATA
   dwFileAttributes     As Long
   ftCreationTime       As FILETIME
   ftLastAccessTime     As FILETIME
   ftLastWriteTime      As FILETIME
   nFileSizeHigh        As Long
   nFileSizeLow         As Long
   dwReserved0          As Long
   dwReserved1          As Long
   cFileName            As String * 260  'MUST be set to 260
   cAlternate           As String * 14
End Type

Public Function Findfile(xstrfilename) As WIN32_FIND_DATA
Dim Win32Data As WIN32_FIND_DATA
Dim plngFirstFileHwnd As Long
Dim plngRtn As Long

plngFirstFileHwnd = FindFirstFile(xstrfilename, Win32Data)  ' 调用API取得文件信息
If plngFirstFileHwnd = 0 Then
  Findfile.cFileName = "Error"                      ' 如果不存在, 返回错误
Else
  Findfile = Win32Data                             ' 否则返回结果。
End If
plngRtn = FindClose(plngFirstFileHwnd)            ' 关闭文件句柄。
End Function

Public Sub getattrib(filename$) 
Dim tfilename As String        ' 初始化变量
tfilename = filename
Dim filedata As WIN32_FIND_DATA

filedata = Findfile(tfilename)        ' 取文件信息

If (filedata.dwFileAttributes And FILE_ATTRIBUTE_HIDDEN) = FILE_ATTRIBUTE_HIDDEN Then
       w_yc = 1     ' 判断是否隐藏属性
     Else
       w_yc = 0
     End If
    
     If (filedata.dwFileAttributes And FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY Then
        w_zd = 1    ' 判断是否只读属性
     Else
        w_zd = 0
     End If
     If (filedata.dwFileAttributes And FILE_ATTRIBUTE_ARCHIVE) = FILE_ATTRIBUTE_ARCHIVE Then
        w_cd = 1   ' 判断是否存档属性
     Else
        w_cd = 0
     End If
  
End Sub

    (2)在评分程序中评分
    如题目要求:将考生文件夹下COLD文件夹中的文件RAIN.FOR设置为隐藏和存档属性。
filename = studentpath & "\cold\rain.for"
          getattrib (filename)
          If w_cd = 1 And w_yc = 1 Then
                 win_2 = win_2 + 3 ' 如果正确就得3分,win_2为记分变量
          End If

    2.文件或文件夹的各种操作的自动评分
    在Windows系统中文件夹是作为一个特殊的文件处理的,文件的操作也就是前文所讲的创建,删除,复制,移动等,判断学生操作是否正确只要从结果来看,考生做完题目后的结果是否与题目要求的结果一致,就可以实现评分。创建、删除文件或文件夹只要看文件或文件夹是否存在,复制文件看源地址和目的地址文件是否都有,并且属性也一致,移动文件源地址不存在文件,目的地址有文件。各种操作都是调运相同函数Exists或FileExists实现。

    利用VB错误捕获和处理机制,声明函数Function Exists(dirstring As String) As Boolean判断文件夹是否存在,实现的核心代码如下:
Function Exists(dirstring As String) As Boolean
    Dim t As String
    On Error GoTo VerifyDir_Error
   t = CurDir
   ChDir dirstring
   ChDir t
   Exists = True
Exit_VerifyDir:
   Exit Function
VerifyDir_Error:
   Exists = False
End Function
    声明函数Function FileExists%(filename$)判断问卷见是否存在。
Function FileExists%(filename$)
Dim f%
   ' Trap any errors that may occur
   On Error Resume Next
   f% = FreeFile
   Open filename$ For Input As #f%
     Close #f%
   ' 如果有错, Err 将不为0.返回False
   FileExists% = Not (Err <> 0)
End Function

    在评分程序中评分,下面通过实例来说明在程序中评分的实现。
    现以题目要求“在考生文件夹下WATER\LAKE文件夹中新建一个文件夹INTEL。
    将考生文件夹下JORK\BOOK文件夹中的文件TEXT.TXT删除。”为例,实现代码如下:
If Exists(studentpath & "\WATER\LAKE\INTEL") Then
win_2 = win_2 + 2 ' 如果正确就得2分,win_2为记分变量
End If

filename = studentpath & "\JORK\BOOK\TEXT.TXT"
fileisexit = FileExists(filename)
If Not fileisexit Then
             win_2 = win_2 + 2 ' 如果正确就得2分,win_2为记分变量
End If

四、结语
    VB简单易学,但功能非常强大。利用API可以实现更多更复杂的功能;而巧妙利用VB的错误处理语句不但可以增强程序的健壮性,而且利用特定语句未返回预期正确的结果而产生错误,就可以判断此语句没有正确执行。

参考文献:
[1] Taruna Goel Rachna Chaudhary著.王小娟,陈代川等译.VBA专业项目实例开发.北京: 中国水利水电出版社,2003
[2] Mark Roberts Tmara Myers著.希望图书创作室译.Office2000 Visual Basic 程序员指南.北京:北京希望电子出版社,1999

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089