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

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем AlexE7E77, 10 дек 2014.

  1. AlexE7E77
    Оффлайн

    AlexE7E77 Новый пользователь

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

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

    Код следующий:
    Код (vb.net):
    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, описание: Требуется объект: "). Описание почему-то заканчивается двойной кавычкой, поэтому не понятно какой-такой объект требуется... Если я подставляю числовые константы - как по маслу, а стоит заставить интерпритатор перебирать массив - ошибка! Почему так?
     
    Последнее редактирование модератором: 10 дек 2014
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.306
    Здравствуйте, AlexE7E77 !
    Рады приветствовать Вас на форуме SafeZone.cc
    Здесь Вы всегда сможете получить помощь по интересующим Вас вопросам по мере наших возможностей и времени.

    Ваш код не проверял, но по всей видимости неверно обозначена граница maxI масива objectsBufer()
    и происходит попытка чтения пути из переменной (элемента масива objectsBufer(maxI)), которой не был назначен объект "Каталог".
    Код (Text):

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

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

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

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

Поделиться этой страницей