2013-02-15 2 views
1

В настоящее время я работаю над скриптом, который будет проходить через заданную папку и искать все файлы с определенным расширением. Затем он распечатает имя и суммирует размер файла. Я считаю, что большинство проблем сортировано, поэтому этот вопрос не о том, как это сделать.VBS: FileSystemObject use in Recursion

Вместо этого, я хочу знать, какая была бы лучшая практика для использования потоков FileSystemObject в рекурсивной функции. Должен ли я использовать один поток для всех вызовов (глобальных или переданных), или я должен создавать новый поток для каждого рекурсивного шага?

Для дополнительного удовольствия я планирую иметь доступ к нескольким компьютерам и по пути 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 

Таким образом, следует один FileStream используется для всех доступов или должен каждый шаг использовать один отдельно? Это спорный вопрос? Будет ли это причиной множественных подключений к каждой системе или если оно будет использовать только один? В принципе, я хочу, чтобы скрипт работал без нарушения работы пользователей или вызывал странные ответы (т. Е. Заканчивал активные подключения). Сценарий будет использоваться только пару раз для аудита, который мы делаем, но в конечном итоге может быть переназначен для будущих аудитов.

Дайте мне знать, что вы думаете. Спасибо за любую помощь,

+0

Я уверен, что большинство кодировщиков не учитывают оптимизацию вызовов FSO в рекурсии, поэтому вы получили мой ответ на этот вопрос. –

ответ

2

Если вы решите установить ссылку на FSO внутри вашей функции, , то в каждой рекурсии будет использоваться новый объект FSO.

Использование одного объекта FSO (глобального или пройденного) вполне достаточно. По крайней мере, я не знаю преимуществ использования нескольких экземпляров FSO.

[EDIT] Я ценю комментарий @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 
+1

Единственная причина, по которой я знаю, что вы не используете глобальный 'FileSystemObject', - это сделать функцию автономной (поэтому ее можно легко использовать в других скриптах). –

+0

Действительно, согласитесь. ;) –

+0

Спасибо за ответ. Полезно знать в будущем, но после разговора с одним из моих приятелей он сделал аргумент в пользу использования WMI. Проблема связана с активными соединениями; его мысль заключается в том, что несколько FSO будут вызывать несколько активных соединений, вызывая таймауты (или даже используя один FSO, это может не закрыть соединение с последним ПК после его завершения). Тем не менее, это будет хорошо работать при работе с локальными путями. – Insomnia