摘 要: 针对磁盘清理工具速度慢、清理不彻底的情况,采用搜索与清理功能分离、程序与数据库分离的方法,加快磁盘清理的速度,并且用户可在数据库中增加垃圾文件的类型,从而实现软件升级,彻底清除磁盘垃圾文件。
关键词: VB 6.0;垃圾文件;清理
磁盘清理是通过删除无用文件,增加磁盘的可用空间。Windows系统附件中的磁盘清理工具可以清理磁盘中的垃圾文件,还有许多专门用于磁盘清理的软件如Disk Cleaner、EasyClean、track eraser pro。但这些软件都存在清理不彻底或清理速度慢的问题,如执行系统附件中的磁盘清理工具后执行命令dir*.tmp/s,发现磁盘仍存在大量垃圾文件,采用Disk Cleaner、track eraser pro等软件虽然清理较彻底但速度较慢。针对以上问题,本文介绍了解决这些问题的方法。
1 解决问题的途经
无论是系统产生的垃圾文件还是应用程序产生的垃圾文件,都存在于固定少数目录中。如果磁盘清理都从每个分区的根目录开始遍历所有文件夹搜索垃圾文件然后执行清理,必然造成软件将大量时间用在搜索垃圾文件上从而造成清理速度慢的问题。因此,必须将软件的搜索功能与清理功能分离。软件若没有某种清理垃圾文件的功能,用户是不能更改软件的,必须将垃圾文件的类型信息保存在数据库的垃圾文件类型表中。搜索程序从数据库的垃圾文件类型表中读取信息执行搜索功能,将搜索到的垃圾文件目录保存在数据库的垃圾文件信息表中,清理程序从数据库的垃圾文件信息表中读取信息,快速搜索固定目录下的垃圾文件并执行清理功能,从而实现快速清除垃圾文件。
2 程序功能
程序主要具有两方面功能:预处理功能和磁盘清理功能。
(1)预处理功能
预处理模块从数据库的垃圾文件类型表中读取记录,搜索硬盘每个分区存在垃圾文件的目录,并将垃圾文件类型及垃圾文件的目录保存在数据库的垃圾文件信息表中。用户若想增加程序清理某种垃圾文件的功能,无需修改程序,只需在垃圾文件类型表中增加一条记录即可。
(2)磁盘清理功能
清理模块从数据库的垃圾文件信息表中读取记录,根据垃圾文件类型及存在目录快速搜索并删除垃圾文件,无需遍历所有文件夹搜索垃圾文件。用户若没有删除或安装软件,也没有在垃圾文件类型表中增加记录,则无需执行预处理模块,直接执行清理模块即可快速清除垃圾文件。程序各模块的功能设计及相互关系如图1所示。
3 个人电脑常见垃圾文件类型[1]及处理方法
个人电脑常见垃圾文件主要有以下三类:
(1)不存在于固定目录中的垃圾文件
主要包括:①扩展名为“.tmp”的临时文件,在软件安装时产生;②扩展名为“.old”、“.bak”临时交换文件,在软件运行时产生;③扩展名为“.log”的日志文件,日志文件记录着Windows系统中所发生的一切,包括各种系统服务的启动、运行、关闭等信息,如Windows自动更新后在c:\windows目录下有kbxxxxx.log文件,如果系统运行正常可以删除;④磁盘检查生成的临时文件,扩展名为“.chk”;⑤用来加快缩略图显示的缓存数据库文件Thumb.db[2],可以方便用户对图片进行预览,图片越多,文件就越大。
(2)存在于固定目录中的垃圾文件
主要包括:①x:\Documents and Settings\用户名\Local Settings\Temp\下的所有文件为用户临时文件,可以删除;②x:\Windows\Temp\下的所有临时文件;③x:\WindowsS\ServicePackFiles下的文件或文件夹,为升级sp1或sp2后的备份文件;④x:\Windows\SoftwareDistribution\download下的所有文件夹,用来存放Windows系统更新时的下载补丁,系统更新成功后可以删除;⑤如果对系统进行过Windows升级,x:\Windows\下$xxxxx$的文件夹为备份文件夹,系统更新成功后可以删除。其中x:为系统安装的分区。
(3)存在于固定目录中的使用痕迹
主要包括:①x:\Documents and Settings\用户名\Cookies\下的所有Cookies文件;②x:\Documents and Settings\用户名\LocalSettings\TemporaryInternet Files\下的所有文件,为IE浏览所保存的临时文件;③x:\Documents and Settings\用户名\Recent\下的所有文件为最近浏览文件的快捷方式;④x:\Documents and Settings\用户名\Local Settings\History\下的所有文件为IE历史记录。其中x:为系统安装的分区。
处理方法:对于(1)类型的垃圾文件,预处理模块搜索其存在目录并存入垃圾文件信息表。对于(2)类型的垃圾文件, 预处理模块直接将其存在目录写入垃圾文件信息表中,然后在清理模块中清除。对于(3)类型的使用痕迹,直接在清理模块中调用API函数清除。
4 程序设计
4.1 数据库设计
数据库中包含2个表:垃圾文件类型表及垃圾文件信息表。垃圾文件类型表结构中只包含1个字段:垃圾文件类型。字段类型为文本型,字段大小为10。垃圾文件信息表结构中包含3个字段:(1)目录。字段类型为文本型,字段大小为100;(2)垃圾文件类型。字段类型为文本型,字段大小为10;(3)删除类型,字段类型为数字型,字段大小为整型,取值为16表示删除文件夹,取值为0表示删除文件。
4.2 预处理模块设计
4.2.1 垃圾文件存在目录的搜索及保存
对于不存在于固定目录中的垃圾文件,由于其存在的分区及目录不确定,预处理模块需搜索每个分区及所有文件夹。硬盘中有几个分区对于个人电脑是不确定的,这需要用API函数GetDriveType(drive)判断磁盘驱动器的类型:参数drive为驱动器盘符,函数返回值为5表示光盘驱动器,返回值为3表示硬盘驱动器,返回值为6表示RAM驱动器,返回值为4表示网络驱动器,返回值为2表示软盘驱动器。为遍历所有分区,需用循环语句调用API函数GetDriveType(drive)[3]判断是否为硬盘分区。其代码如下:
x=3
i=67
Do While x=3
x=GetDriveType(Chr(i)+“:”)
If x=3 Then
R=Chr(i)+“:”
fn=TreeSearch(R,cond,ff())
End If
i=i+1
Loop
其中,TreeSearch(R,cond,ff())是自定义函数(cond参数指定的垃圾文件类型)。函数功能是从分区根目录R开始搜索存在垃圾文件的目录,并将目录保存在数组ff()中。程序调用函数GetDriveType(drive)判断由Chr(i)+“:”盘符指定有分区是否为硬盘驱动器,若是硬盘驱动器则调用TreeSearch()存在垃圾文件的目录。程序将搜索到的结果以记录的形式保存在数据库垃圾文件信息表中。
对于存在于固定目录中的垃圾文件,由于操作系统安装的分区及目录可以更改,用户名可由用户设置,上述x:\Windows是变量,在VB中,可用函数Environ(“windir”)获取其值。变量x:\Windows\SoftwareDistribution\download的值可用Environ(“windir”) & “\SoftwareDistribution\download”得到。x:\Documents and Settings\用户名\Local Settings\Temp\的实际值可用函数Environ(“temp”)获取。预处理模块直接以记录的形式将存在于固定目录中的垃圾文件信息保存在数据库垃圾文件信息表中。
4.2.2 预处理模块所需控件
(1)ADO DATA控件ADODC1,用于连接数据库打开指定的表,visible属性为false。
(2)命令按钮command1,用于添加垃圾文件类型并保存在数据库中。caption属性为“添加”,单此按钮弹出对话框要求输入垃圾文件类型,程序将其保存在垃圾文件类型表中。为避免删除“.sys”、“.exe”、“.dll”等正常文件,在保存前应对其合法性进行判断。
4.3 清理模块设计
4.3.1 清理模块所需控件
(1)ADO DATA控件ADODC1,用于连接数据库打开指定的表,visible属性为false。
(2)用于保存垃圾文件的列表框list1及保存垃圾文件夹的列表框list2。
(3)标签label1用于显示垃圾文件清理结果。
(4)命令按钮command1,caption属性为“清除垃圾文件(夹)”,用于清除垃圾文件和垃圾文件夹。
(5)命令按钮command2,caption属性为“清除使用痕迹”,用于清除第3节(3)所述的使用痕迹。
4.3.2 垃圾文件的搜索与清除
对于不存在或存在于固定目录中的垃圾文件,由于在预处理模块已经将其存在目录、垃圾文件类型、删除类型保存在数据库垃圾文件信息表中,因此,程序只需从表中依次读取记录,调用自定义函数search(path,type,deletype)从path目录搜索由type指定的垃圾文件(夹),根据deletype的取值,如果要删除的是文件,则搜索并添加垃圾文件于列表框list1;如果要删除的是文件夹,则搜索并添加垃圾文件夹于列表框list2。自定义函数search(path,type,deletype)3个参数的取值是记录中3个字段的取值。用kill函数删除List1中指定的垃圾文件,有的垃圾文件正在使用而无法删除,可用On Error Resume Next跳过。用shell语句调用DOS内部命令rd删除List2指定的垃圾文件夹,参数/s表示除目录本身外,还将删除指定目录下的所有子目录和文件。/q表示以安静模式删除,删除目录树时不要求确认。其代码如下:
For I=0 To List1.ListCount-1
On Error Resume Next
Kill List1.List(I)
Next I
For I=0 To List2.ListCount-1
On Error Resume Next
Shell Environ(“system”)+“\cmd.exe/crd”+List2.List(I)
+“/s/q”,vbHide
Next I
IE的缓存和Cookies,可以通过API函数来进行操作,如果要查找所有的缓存和Cookies,需要使用FindFirstUrlCacheEntry和FindNextUrlCacheEntry这2个函数判断IE的缓冲文件存储的位置并取得该文件;如果要删除相对应的缓存和Cookies,就使用DeleteUrlCacheEntry函数[4]。删除最近访问过的文档可以通过API函数SHAddToRecentDocs(SHARD_PATH, vbNullString)来实现。清除IE历史记录,可直接定位到注册表中的位置,然后删除 用API函数RegDeleteKey(HKEY_CURRENT_USER,“Software\Microsoft\Internet Explorer\TypedURLs”)[5]实现。
5 程序实现
5.1 创建数据库
创建数据库中2个表:垃圾文件类型表及垃圾文件信息表的表结构。“.tmp”、“.old”、“.bak”等作为记录添加到垃圾文件类型表中。
5.2 预处理模块实现
在新建工程中,将控件添加到窗口,并设置其属性。要使用adodc1控件,需执行菜单命令[工程]|[部件],选择“Microsoft ADO Data Control 6.0”,单击“确定”。对预处理模块使用的API函数、结构、常量加以声明,编写form_load()、command1_click()过程代码。程序测试完成后将工程生成“.exe”文件。
5.3 清理模块实现
在新建工程中,将控件添加到窗口,并设置其属性。对清理模块使用的API函数、结构、常量加以声明,编写command1_click()、command2_click()过程代码,程序测试完成后将工程生成.exe文件。
本程序实现快速清理磁盘垃圾文件的关键在于:根据垃圾文件实际只存在于少数固定目录的特点,采用两分离技术(程序与数据库分离、搜索目录模块与执行清理模块分离),使其在计算机没有安装或删除软件的情况下只需执行清理模块,避免程序将大量时间花在搜索垃圾文件上,在清理磁盘垃圾文件时具有快速、彻底的特点,避免垃圾文件存在造成的磁盘空间的浪费。本程序在VB6.0+ACCESS 2003、Windows 2003及Windows XP操作系统下运行通过。
参考文献
[1] 张桂勇,陈芳琼.API FOR Windows 2000/XP详解[M].北京:清华大学出版社,2003.
[2] 东方人华.Windows API编程范例入门与提高[M].北京:清华大学出版社,2004.
[3] 个人电脑常见垃圾文件类[EB/OL].http://zhidao.baidu.com/question/910249.html.2005-11-11.
[4] 如何删除临时文件夹中的内容?[EB/OL].http://topic.csdn.net/t/20060207/18/4544077.html.2006-02-07.
[5] 周利荣.Windows XP系统的几个特殊文件和文件夹[J].电脑学习,2008(6):42-43.