使用VBScript的递归子内存泄漏

时间:2018-05-14 18:58:20

标签: vbscript

我正在创建一个脚本,允许用户使用搜索词在指定目录中进行搜索。该脚本将创建一个CSV文件,然后在文件名中写入基本文件名,文件大小,上次修改日期以及包含搜索项的文件的绝对路径。但是,我在搜索文件夹中的子文件夹时遇到了问题。问题是我在子程序中耗尽了内存。

这是我到目前为止写的剧本。

Dim fileCount, searchPath, searchTerm, CheckFile, wholePath
Dim objFSO, objFolder, objFile, objWriteFile
Dim savePath

objCheckFile = "C:\Users\USERFILE\Desktop\Audit.csv"

Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")

'Asks for directory to search in
searchPath = InputBox("Please enter the path of the folder you would like to search", "Where am I searching?")
Set objFolder = objFSO.GetFolder(searchPath)

'Asks for the search term to use
searchTerm = InputBox("Please enter the term you would like to search for", "What am I searching?")

If objFSO.FileExists(objCheckFile) Then
    WScript.Echo "Please delete the file named Audit.csv before trying again"
Else
    Set objWriteFile = objFSO.CreateTextFile("Audit.csv", ForWriting, True)
End If

Set colFiles = objFolder.Files
Set colFolders = objFolder.SubFolders

'Searches for files within the folder and writes to a CSV file
For Each objFile In colFiles
    If InStr(LCase(objFSO.GetFileName(objFile)), LCase(searchTerm)) > 0 Then        
        objWriteFile.Write objFSO.getFileName(objFile) & ", "
        objWriteFile.Write objFile.size & ", "
        objWriteFile.Write objFile.DateLastModified & ", "
        objWriteFile.Write objFSO.getAbsolutePathName(objFolder) & objFSO.getFileName(objFile) 
        objWriteFile.Writeline
    End If
Next

ShowSubFolder objFolder

Sub ShowSubFolder(Folder)
    If InStr(LCase(objFSO.GetFileName(objFile)), LCase(searchTerm)) > 0 Then
        objWriteFile.Write objFSO.getFileName(objFile) & ", "
        objWriteFile.Write objFile.size & ", "
        objWriteFile.Write objFile.DateLastModified & ", "
        objWriteFile.Write objFSO.getAbsolutePathName(objFolder) & objFSO.getFileName(objFile) 
        objWriteFile.Writeline
    End If
    For Each objSubFolder In colFolders
        ShowSubFolder objSubFolder
    Next
End Sub

1 个答案:

答案 0 :(得分:0)

您的递归永远不会因此而终止:

Set colFiles = objFolder.Files
Set colFolders = objFolder.SubFolders

'...

ShowSubFolder objFolder

Sub ShowSubFolder(Folder)
    '...
    For Each objSubFolder In colFolders
        ShowSubFolder objSubFolder
    Next
End Sub

这类似于fork bomb。对于objFolder的每个子文件夹,您再次递归到objFolder的每个子文件夹。然后再次。然后再次。而且......

将您的代码更改为此代码,它应该执行您想要的操作:

Set colFiles = objFolder.Files

'...

ShowSubFolder objFolder

Sub ShowSubFolder(Folder)
    '...
    For Each objSubFolder In Folder.SubFolders
        ShowSubFolder objSubFolder
    Next
End Sub

您可能还想调整递归过程中的条件,因为它使用在过程外定义的objFileobjFolder