目前我正在编写一个脚本,该脚本将遍历给定的文件夹并搜索具有特定扩展名的所有文件。然后它将打印出名称并将文件大小相加。我相信我已经解决了大部分问题,所以这个问题不是关于如何做到这一点。
相反,我想知道在递归函数中使用FileSystemObject流的最佳实践。我应该为所有调用使用单个流(全局或传递),还是应该为每个递归步骤创建新流?
为了获得额外的乐趣,我计划通过UNC路径访问多台PC。是的,我希望有更好的方法可以做到这一点,但我对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
那么,是否应该将一个文件流用于所有访问,还是应该分别使用一个文件流?这是一个有争议的问题吗?这是否会导致与每个系统的多个连接,还是只能使用一个?基本上我希望脚本能够在不中断用户的情况下工作,或者导致奇怪的响应(即,活动连接耗尽)。该脚本仅用于我们正在进行的审计,但最终可能会用于未来的审计。
让我知道你的想法。谢谢你的帮助,
答案 0 :(得分: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