向伟忠
摘 要 本文提出对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
|