VBS Перебор элементов массива объектов, заполненного с помощью рекурсии

AlexE7E77

Новый пользователь
Сообщения
1
Реакции
0
Решил я написать программу для сравнения двух папок и если в одной из них не достаёт вложенных папок или файлов, имеющихся в другой, то она дополняется ими соответственно. В конечном итоге получится что-то вроде инструмента проводника "Портфель" в ОС Windows, но с расширенными возможностями.

Реализовывать я начал так:
  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 1;
  • создаём массив объектов всех вложенных папок и файлов, содержащихся в папке № 2;
  • сравниваем оба этих массива и дополняем недостоющими элементами соответственно.
Но в самом начале (при создании массива объектов всех вложенных папок и файлов, содержащихся в папке № 1) столкнулся с непредвиденной проблемой.

Код следующий:
VB.NET / VBA:
dim i, maxI
dim objectsBufer(1000)
dim put

i = 1
allFoldersBufer("C:\папка1")

function allFoldersBufer(allDir)
    set f = createObject("scripting.fileSystemObject").getFolder(allDir)
    set subF = f.subFolders
    for each folder in subF
        set objectsBufer(i) = folder
        i = i + 1
        allFoldersBufer(allDir & "\" & folder.name)
    next
end function

maxI = i

put = "C:\Результат работы.txt"
set fso = createObject("scripting.fileSystemObject")

if fso.fileExists(put) then
    set file = fso.getFile(put)
    set textSte = file.openAsTextStream(2, -1)
else
    set textSte = fso.createTextFile(put)
end if

i = 1
msgBox "i = " & i & "     maxI = " & maxI

for i = 1 to maxI
    textSte.writeLine objectsBufer(1).path & "     Имя папки: " & objectsBufer(1).name
next
textSte.close

Прошу обратить внимание на третью снизу строку: если в ней заменить константу 1 на переменную i то интерпретатор выдаёт ошибку (код 800А01А8, описание: Требуется объект: "). Описание почему-то заканчивается двойной кавычкой, поэтому не понятно какой-такой объект требуется... Если я подставляю числовые константы - как по маслу, а стоит заставить интерпритатор перебирать массив - ошибка! Почему так?
 
Последнее редактирование модератором:
Здравствуйте, AlexE7E77 !
Рады приветствовать Вас на форуме SafeZone.cc
Здесь Вы всегда сможете получить помощь по интересующим Вас вопросам по мере наших возможностей и времени.

Ваш код не проверял, но по всей видимости неверно обозначена граница maxI масива objectsBufer()
и происходит попытка чтения пути из переменной (элемента масива objectsBufer(maxI)), которой не был назначен объект "Каталог".
Код:
set objectsBufer(i)= folder
i = i +1
allFoldersBufer(allDir &"\"& folder.name)
Здесь Вы сначала присваиваете, а затем увеличиваете значение счетчика,
соответственно последнему значению не будет присвоен обеъект.

На счет практической стороны скрипта:
- Вам требуется полный рекурсивный обход дерева каталогов или Вы хотите ограничится только подкаталогами (1 уровень) ?
- Если предполагается механизм синхронизации, планируете ли Вы проверять не только наличие файла, но и его идентичность с целевым?
- Создание массива объектов само по себе очень ущербное занятие для памяти. В массиве лучше хранить только путь к файловому объекту.

Если файлов/папок очень много этот алгоритм покажет себя весьма медленно (уменьшение скорости в геометрической прогрессии).
Я бы посоветовал воспользоваться 1 или 2-мя объектами Scripting.Dictionary (словарь).
После полного сканирования директории, проходя по элементам 2-го массива, Вы сможете сразу проверять наличие
файлового объекта, обращаясь к словарю вместо полного перебора элементов 1-го массива.

2) Открывать файл для создания/перезаписи достаточно проще такой строчкой:
Код:
Set textSte = FSO.OpenTextFile(put, 2, True)
Остальные проверки будут не нужны.
И последнее, если это не учебная задача, то для нужд администрирования есть несколько готовых интрументов,
например консольная утилита Robocopy, которая позволит проделать тоже самое (доступна в Windows, начиная с версии Vista или из пакета Windows Resource Kit).
 
Назад
Сверху Снизу