Windows在后台不停地为我们工作,同时也不断地给我们带来一些临时文件。虽然这些临时文件在Windows或者应用程序正常退出时会被自动删除,可是大家都知道Windows和位居其下的应用程序是如此的不稳定,不正常中止的现象时有发生,这样,临时文件就随着时间的推移而逐渐堆积起来。它们不但占据了我们有限的空间,在很多时候也给我们的系统带来了更多不稳定因素,于是定期删除这些临时文件便成了我等Windows用户的家常便饭。
常规的临时文件删除方法
要删除这些临时文件,我们平时是这样做的:
1.按下Win+F打开搜索窗口,查找以“*.tmp”(不包括引号)为后缀的文件,当然了我们的查找是要包含“搜索子文件夹”的。
2.在搜索出来的结果窗口中,按下Ctrl+A选择所有文件,然后删除。
不过事情并不像我们所想象的那样简单,在很多时候,你可能会遇到这样的烦恼——Windows遇到了不能删除的临时文件(如果一个临时文件正在被使用当然是不能删除的),而这种文件在我们打开多个应用程序的时候会更多。
WSH的文件处理对象
不过有了Windows Script语言,这些烦恼应该置于脑后了,WSH强大的文件处理引擎包含了FileSystemObject、Folder、File和Drive四个对象,巧妙运用这四个对象的属性和方法,可以让我们的文件操作更加得心应手,它们的方法和属性很多,我这里也就不再一一列举。有兴趣的朋友可以到替换www.microsoft.com/scripting下Download一个VBScript的文档,保你受用无穷……
我们通常可以通过一个FileSystemObject得到一个Folder(文件夹)和File(文件对象),在VBScript中可以实现:
Set FSO = CreateObject("Scripting. FileSystemObject")
这里我们只所以用Set语句而不是使用一个简单的“=”是因为我们需要得到的FSO是一个对象而不是一个变量,比如下边一段可以让我们在C:盘很目录下建立一个名为TestFile.txt的文本文件,并且在该文本文件中写入一段话:
Set FSO = CreateObject("Scripting. FileSystemObject")
Set TestFile = FSO.CreateTextFile("c:/TestFile.txt", True)
TestFile.WriteLine("这仅仅是我为了测试而生成的一个临时文件。")
TestFile.Close
如果我们需要知道一个已经存在的文件的属性,可以使用FileSystemObject或者Folder对象来得到,比如下边的语句将要显示我们前边生成的文件的各种属性:
Set FSO = CreateObject("Scripting. FileSystemObject")
AFileSpec = "c:/TestFile.txt"
Set AFile = FSO.GetFile(AFileSpec)
Message= AFile.Name & " 在磁盘 " & UCase(AFile.Drive) & "上" & vbCrLf
Message = Message & "创建于: " & AFile.DateCreated & vbCrLf
Message = Message & "最后存取时间: " & AFile.DateLastAccessed & vbCrLf
Message = Message & "最后修改时间: " & AFile.DateLastModified
MsgBox Message, 0, "文件信息"
现在我们来看看,如何得到一个文件夹中所有的临时文件,说起来很简单:如果你创建了一个FileSystemObject对象,你就可以通过它的GetFolder方法来得到一个特定的文件夹,这样你就有了一个Folder对象,然后通过Folder的Files属性,你可以得到一个文件夹中所有的文件。接下来就更简单了,你逐个比较每个文件的后缀名,来判断是否需要删除,下边的一段代码用来删除一个文件夹中的所有以Tmp为后缀的文件:
Set TheFiles = AFolder.Files
TheExtension = "tmp"
For Each AFile In TheFiles
If UCase(Right(AFile.Name, 3)) = TheExtension Then
AFile.Delete
End If
Next
不过上边的这段代码在删除正在使用的临时文件时还是会报错,对于这个问题我们可以通过使用On Error Resume Next语句来解决;另外还有一个需要解决的问题——上边的程序限定了我们要删除的文件的后缀名是3个字符,这样如果我们需要那些文件后缀是4个的.jpeg、.html文件,还要修改程序才能实现,其实有一个很好的办法可以解决,那就是用FileSystemObject的GetExtensionName属性,那么这段代码应该是这样的:
Sub KillFilesWithExtensionIn (AFolder,TheExtension)
Dim AFile, TheFiles
On Error Resume Next
Set TheFiles = AFolder.Files
For Each AFile In TheFiles
If UCase(FSO.GetExtensionName(AFile.Path)) = TheExtension Then
AFile.Delete
End If
Next
End Sub
现在我们只有一个问题了,那就是搜索一个文件夹的子文件夹。这个问题更容易解决,我们通过Folder的SubFolders属性就可以得到一个文件夹的所有子文件夹,然后一一遍历就可以了,代码如下:
Sub WorkWithSubFolders(ByVal AFolder, ByVal TheExtension)
Dim MoreFolders, TempFolder
KillFilesWithExtensionIn AFolder,
TheExtension
Set MoreFolders = AFolder.SubFolders
For Each TempFolder In MoreFolders
WorkWithSubFolders TempFolder, TheExtension
Next
End Sub
最后的代码实现
需要说明一下的是,我们这里只删除C:盘所有的临时文件,如果你需要删除其它磁盘的临时文件,将源程序稍加修改就可以实现(你甚至可以一次删除所有磁盘的临时文件),同时由于源代码比较长,想免去录入之苦的朋友可以到替换www.pcdigest.com/magazine/200102/wsh01.zip下载。
Dim FSO, WSH, TheExtension, TheCount
Dim TheFolder, Message, YesNo
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
Set TheFolder = FSO.GetFolder("C:/") '起始目录为C:盘根目录
TheExtension = InputBox("请输入想要删除的文件的后缀名(不包括.号),比如:tmp")
TheExtension = UCase(TheExtension)
Message = "你想要删除所有"
Message = Message & "后缀名为 " & vbCrLf
Message = Message & vbCrLf & TheExtension &vbCrLf & "的文件吗?"
YesNo = MsgBox(Message, vbYesNo)
If YesNo = vbYes Then
Message = "按下回车或者“OK”开始删除 "
Message = Message & "注意,这可能需要比较长的一段时间。 "
Message = Message & "而且每处理100个子目录将会显示一条信息。"
Message = Message & "每条信息将保留一秒钟时间"
MsgBox Message
WorkWithSubFolders TheFolder, TheExtension
End If
MsgBox "文件删除完毕,共处理了 " & TheCount & "个目录,按下“OK”或者回车结束。"
Sub WorkWithSubFolders(ByVal AFolder, ByVal TheExtension)
Dim MoreFolders, TempFolder
TheCount = TheCount + 1 'VBScript没有静态变量,
'所以我们使用了一个全局变量
If TheCount Mod 100 = 0 Then
Message = "已经处理了 " & TheCount & "个文件夹。"
WSH.Popup Message, 1,"文件删除中……" '弹出信息框停留一秒钟
End If
KillFilesWithExtensionIn AFolder, TheExtension
Set MoreFolders = AFolder.SubFolders
For Each TempFolder In MoreFolders
WorkWithSubFolders TempFolder, TheExtension
Next
End Sub
Sub KillFilesWithExtensionIn(AFolder,TheExtension)
Dim AFile, TheFiles
On Error Resume Next
Set TheFiles = AFolder.Files
For Each AFile In TheFiles
If UCase(FSO.GetExtensionName(AFile.Path)) = TheExtension Then
AFile.Delete
End If
Next
End Sub
终于完成我们了我们预期的目的,虽然看起来很累,可是“不劳无获”,现在还不赶紧去清理一下自己的临时文件……