巧用WINDOWS脚本语言删除临时文件

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
   终于完成我们了我们预期的目的,虽然看起来很累,可是“不劳无获”,现在还不赶紧去清理一下自己的临时文件……

posted on 2009-01-05 23:59  starspace  阅读(1323)  评论(0编辑  收藏  举报

导航