1

目前,我正在编写一个脚本,该脚本将遍历给定文件夹并搜索具有特定扩展名的所有文件。然后它将打印出名称并汇总文件大小。我相信我已经解决了大部分问题,所以这个问题不是关于如何做到这一点。

相反,我想知道在递归函数中使用 FileSystemObject 流的最佳实践是什么。我应该为所有调用(全局或传递)使用单个流,还是应该为每个递归步骤创建一个新流?

为了额外的乐趣,我计划让这个访问多台 PC,并通过 UNC 路径。是的,我希望有更好的方法来做到这一点,但我对 VBS 比较陌生。

当前代码:

'Recursive Function handles search of files in folder and subfolders.
Function UNCSearchFolder(strUNCRootPath, strUNCNextFolder)  
 Dim objFSOUNCSearchFolder, objFSOUNCSearchFolder2, colFolderList, objFolder, strCurrentFolder, strSubFolder

 'Get list of Subfolders in folder: <Rootpath>\<Nextfolder>
 strCurrentFolder = strUNCRootPath & "\" & strUNCNextFolder & "\"
 Set objFSOUNCSearchFolder = CreateObject("Scripting.FileSystemObject")
 Set objFSOUNCSearchFolder2 = objFSOUNCSearchFolder.GetFolder(strCurrentFolder)
 Set colFolderList = objFSOUNCSearchFolder2.SubFolders

 'Subfolder dive
 For Each objFolder in colFolderList
  strSubFolder = objFolder.name
  'REMOVE THIS ECHO LATER
  wscript.echo strSubFolder
  UNCSearchFolder(strCurrentFolder, strSubFolder)
 Next

 'Search for files here


 'GC on File Streams
 Set objFSOUNCSearchFolder2 = Nothing
 Set objFSOUNCSearchFolder = Nothing
End Function

那么,是应该将一个文件流用于所有访问,还是应该每个步骤单独使用一个文件流?这是一个有争议的问题吗?这会导致到每个系统的多个连接还是应该只使用一个?基本上,我希望脚本能够在不干扰用户或引起奇怪响应(即,活动连接用完)的情况下正常工作。该脚本只会在我们正在进行的审计中使用几次,但最终可能会重新用于未来的审计。

让我知道你的想法。谢谢你的帮助,

4

1 回答 1

2

如果您选择在函数内部设置对 FSO 的引用,那么在每个递归中都将使用新的 FSO 对象。

使用单个 FSO 对象(全局的或传递的)就足够了。至少我不知道使用多个 FSO 实例有什么好处。

[编辑] 我很欣赏@AnsgarWiechers 的评论,并且为了使代码准备好重新使用,同时将 FSO 排除在函数之外,我们可以将函数包装在一个类中。

With New FileInfo
    WScript.Echo .FileSize("C:\temp", "txt", True)
End With


Class FileInfo

    Private m_oFSO

    Public Function FileSize(sRootDir, sExtension, bRecursive)
        Dim oFolder, oFile, sFExt
        sFExt = LCase(sExtension)
        Set oFolder = m_oFSO.GetFolder(sRootDir)
        For Each oFile In oFolder.Files
            If LCase(m_oFSO.GetExtensionName(oFile.Name)) = sFExt Then
                FileSize = FileSize + oFile.Size
            End If
        Next
        If bRecursive Then
            Dim oSubFolder
            For Each oSubFolder In oFolder.SubFolders
                FileSize = FileSize + FileSize(oSubFolder, sExtension, True)
            Next
        End If
    End Function

    Private Sub Class_Initialize
        Set m_oFSO = CreateObject("Scripting.FileSystemObject")
    End Sub

    Private Sub Class_Terminate
        Set m_oFSO = Nothing
    End Sub

End Class
于 2013-02-16T15:36:39.833 回答