摘 要: 针对现有计算机考试系统中客户端与服务器之间的文件传输问题提出一种解决方案并加以实现。利用VHD技术可以将客户端文件作为一个独立磁盘上交。特别是客户端文件被锁死后导致上传失败的情况。实测结果证明,将VHD技术应用到考试系统中可以很好地解决考试系统中的传输问题,特别是客户端文件被锁死后导致上传失败的情况。
关键词: VHD; 考试系统; 文件传输; 文件上传
中图分类号: TN911?34; TP31 文献标识码: A 文章编号: 1004?373X(2017)03?0121?03
Application research on general?purpose computer examination
system based on VHD technology
ZHANG Danjue
(School of Information Science and Technology, Sanda University, Shanghai 201209, China)
Abstract: A solution is proposed and implemented to solve the file transfer problem between the client and server in the available computer examination system. The VHD technology is used to take the client file as an independent disk for handing in. The actual measurement results show that the VHD technology applied to the computer examination system can solve the transmission problem better, especially for the uploading failure situation caused by the locked client file.
Keywords: VHD; examination system; file transfer; file uploading
0 引 言
随着网络技术和计算机技术的迅猛发展,将各类考试移植到计算机上进行已经是大势所趋,与传统考试相比,它具有无可比拟的优越性[1]。至今为止,用于考试的计算机软件系统种类繁多,其中,有不少较为成功的产品,但是,这些考试系统对于客户端与服务器之间的文件传输都没有较好的解决方案。目前,大多数考试系统将考生文件保存在客户端,当考试结束后再通过底层拷贝将考生文件复制到服务器上,但经常遇到各类问题而造成传输错误的状况,特别是文件被锁死后导致上传失败的情况尤为突出。为此,在对现有多种考试系统进行分析研究的基础上提出将VHD技术应用到考试系统中,以解决文件传输的问题。
1 VHD概述
VHD是Virtual Hard Disk(虚拟磁盘)的简称,利用电脑硬盘空间在电脑里虚拟出一个磁盘,用户可以像普通磁盘一样使用(包括格式化、分区以及读写等操作),但是,它并不是物理上真实存在的磁盘,而是以文件形式(扩展名为.vhd)存放在物理硬盘上的。其优点如下:
(1) 维护简单:与普通磁盘操作一样,容易上手。
(2) 加载与卸载容易:在不关机或重启的情况下,可以像U盘一样使用。
(3) 备份和迁移方便:仅仅需要将物理硬盘上的虚拟文件进行备份,再将该文件复制到目标计算机上即可。
(4) 安全性好:既可以对虚拟磁盘中的分区进行读写权限的设置,也可以对虚拟文件本身设置相应权限,以保证该文件的安全性。
2 通用计算机考试系统中VHD的设计
通用计算机考试系统是由组卷模块、考试模块和阅卷及评价模块三部分组成,如图1所示。
在考试中经常会涉及到文件的传输,例如,考试开始时需要由服务器下发考试素材,考试结束后需要由客户端上传考试结果等,在实际测试中发现有以下状况出现:
(1) 当文件夹嵌套层次较多时,会出现文件缺失的情况。
(2) 当使用文件端口打印文件时,输出的文件容易被锁死。
(3) 相关应用程序未关闭时,如:PS,Flash等,容易造成系统蓝屏。
(4) 当使用SQL Server考核数据库相关课程時,必须强制关闭相应SQL进程才能上传数据库文件。
鉴于以上情况,将VHD技术应用到考试系统中,以解决文件传输的问题,其流程如下:
(1) 在组卷模块中,由管理员设置考试数据盘的属性,例如:盘符号、容量、使用权限等,系统根据设置的参数生成虚拟磁盘文件,即VHD文件,并把考试所要用到的素材、样张等加载到该虚拟磁盘中。
(2) 考试前,由监考老师使用考试模块为每个考生随机指定考试座位,当考生信息和考试计算机(即客户端)绑定时,服务器会自动下发VHD文件。
(3) 当考生登录考试模块时,考试系统将根据之前设置的盘符号加载VHD文件,生成虚拟磁盘,考生在考试中使用到的所有文件都包含在该磁盘中。
(4) 考试过程中,考试模块会根据之前设置的时间间隔定时在后台备份该VHD文件,备份时无需卸载虚拟磁盘,也不影响学生考试。
(5) 考试结束后,客户端卸载虚拟磁盘,将VHD文件上传服务器即可。
(6) 在阅卷及评价模块中,读取VHD文件中的考试数据即可评分。
根据以上构思可以很好地解决文件传输问题,避免文件缺失、锁死等造成交卷失败的情况频繁出现。
3 通用计算机考试系统中VHD的实现
VHD技术通常用于安装多个操作系统,一般和虚拟机一起使用,而用于考试系统中是一种创新,且考虑到公共机房软件安装的问题,不可能在每台计算机上面都安装Virtual PC等相关虚拟化软件,所以,考试系统需要自行解决虚拟磁盘的加载、权限设置、卸载等一系列问题。经过研究,利用微软提供的一些VHD接口以及自行编写的函数来完成这些工作。
加载虚拟磁盘使用微软提供的 “AttachVirtualDisk”API,通过设置“ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME”来限制该虚拟磁盘只能被考试系统管理,设置“ATTACH_VIRTUAL_DISK_FLAG_READ_ ONLY”来限制该虚拟磁盘为只读属性,设置“ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER”来限制该虚拟磁盘加载后无盘符号,主要代码如下所示:
Int virtualDisk::attach(bcol readOnly)
{ ATTACH_VIRTUAL_DISK_FLAG flags;
flags=ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_ LIFETIME;
If(readOnly)
Flags|=ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY;
ATTACH_VIRTUAL_DISK_PARAMETERS attachParameters;
attachParameters.Version=ATTACH_VIRTUAL_DISK_VERSION_1;
return AttachVirtualDisk(vhdHandle,0,flags,0,&attachParameters,0);
}
加载虚拟磁盘后,需要给该磁盘分配一个盘符号,但考虑到各个公共机房计算机的磁盘设置有所不同,所以,在组卷模块中由系统管理员给定一个可以使用的盘符号,首先,通过“GetVirtualDiskPhysicalPath”函数获取虚拟磁盘的属性,然后,通过“FindFirstVolume”函数和“FindNextVolume”函数获取盘符号,再通过“CreateFile”函数测试该盘符号是否可用,即有无冲突,最后,通过“SetVolumeMountPoint”方法将该盘符号绑定给虚拟磁盘。部分代码如下所示:
int virtualDisk::mount(const QString &mountPoint)
{ wchar_t physicalDrive[MAX_PATH];
ULONG bufferSize = sizeof(physicalDrive);
GetVirtualDiskPhysicalPath(vhdHandle, &bufferSize, physicalDrive);
wchar_t volumeName[MAX_PATH];
DWORD bytesReturned;
VOLUME_DISK_EXTENTS diskExtents;
HANDLE hFVol = FindFirstVolume(volumeName, sizeof(volumeName));
bool hadTrailingBackslash = false;
do {
int backslashPos = wcslen(volumeName) ? 1;
if (hadTrailingBackslash = volumeName[backslashPos] == ′\\′)
{ volumeName[backslashPos] = 0; }
HANDLE hVol=CreateFile(volumeName,0, FILE_SHARE_ READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0, NULL);
if (hVol == INVALID_HANDLE_VALUE) { return 0; }
DeviceIoControl(hVol, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &diskExtents, sizeof(diskExtents), &bytesReturned, NULL);
if (diskExtents.Extents[0].DiskNumber == 0) {
if (hadTrailingBackslash) { volumeName[backslashPos] = ′\\′; }
SetVolumeMountPoint(TEXT("H:\\"), volumeName); }
} while (FindNextVolume(hFVol, volumeName, sizeof(volumeName)));
FindVolumeClose(hFVol);
return 0;
}
完成加載和盘符号设置后,客户端的设备管理器中就出现了一块虚拟磁盘,如图2所示。
考试完成后,所有的考试结果都保存至虚拟磁盘中,因此,需要将虚拟磁盘进行卸载,并将其以考生准考证号命名,保存到考试服务器中,以便阅卷及评价模块进行调用。通过“detach”函数完成该项工作,部分代码如下所示:
int virtualDisk::detach()
{ DETACH_VIRTUAL_DISK_FLAG flags;
flags = DETACH_VIRTUAL_DISK_FLAG_NONE;
return DetachVirtualDisk(vhdHandle, flags, 0);
}
int virtualDisk::close()
{ return CloseHandle(vhdHandle);}
Int workThread::vhdDetah(const QString &vhdFile,int sessionid)
{ virtualDisk vhdDisk;
If (int error=vhdDisk.open(vhdFile))
{ emit vhdFinished(error,sessionid);
Return error;}
If (int error=vhdDisk.detach())
{ if(error!=1168)
{vhdDisk.close();
Emit vhdFinished(error,sessionid)l
Return error;}
}
vhdDisk.close();
emit vhdFinished(0,sessionid);
return 0;
}
以某学院的3 300人的计算机文化基础考试为例,收卷成功率达到100%,无收卷异常出现,考后阅卷正常,成绩分布如图3所示。
4 结 语
将VHD技术应用到计算机考试系统中是个创新,这个创新基本上解决了考试系统在收卷时因为种种原因造成系统卡死的问题。实测结果说明该技术运用于通用计算机考试系统是可行的。
参考文献
[1] 张丹珏,姚伟.多课程计算机考试系统的研究[J].微型电脑应用,2010,26(11):15?17.
[2] MSDN. Developers resource [EB/OL]. [2015?03?21]. https://msdn.microsoft.com/en?us/library/windows/desktop/dd323700(v=vs.85).aspx.
[3] 陈俊斌.基于任务驱动法的高校计算机基础教学改革[J].物联网技术,2015,5(2):107?108.
[4] 李淑侠,魏广平.动态可重构可穿戴计算机软件平台的设计与实现[J].物联网技术,2014,4(6):50?51.
[5] 张婷婷.基于网络的新型计算机考试系统[J].科研,2015(8):22?23.
[6] 高金丽.高职院校计算机网络技术人才培养模式的探讨:基于工业互联网[J].物联网技术,2015,5(5):95?96.