Рекурсия перезаписывает локальные переменные! Почему?
function processFolder(oSource, strTarget) { for (var ext in extArray) { var source = oSource.Path + "\\*." + extArray[ext]; try {fso.CopyFile(source, strTarget)} catch(e) {} } var subFolders = new Enumerator(oSource.SubFolders); for (; !subFolders.atEnd(); subFolders.moveNext()) { var target = strTarget + "\\" + subFolders.item().Name; processFolder(subFolders.item(), target) } } При рекурсивном вызове функции processFolder локально объявленные переменные subFolders и source перезаписываются и, соответственно, весь алгоритм рушится. Почему так происходит? Ведь явно указано var перед определением переменной. Как этого избежать? Ничего не понимаю. Прошу вашего совета, дамы и господа. |
замените все subFolders на processFolder.subFolders и уберите var
|
Рекомендуемый Вами приём ровным счётом ничего не меняет, локальная переменная всё равно перезаписывается.
|
Попробовал ещё одно ухищрение — рекурсивный вызов через arguments.callee. Ситуация не изменилась.
|
вот более полная версия скрипта, для тех, кто хочет запустить его на исполнение:
extArray =["txt","doc","docx","xls","xlsx"]; strTarget = "D:\\target"; sourceArray = ["E:"]; fso = new ActiveXObject("Scripting.FileSystemObject"); if (fso.FolderExists(strTarget)) fso.GetFolder(strTarget).Delete(true); fso.CreateFolder(strTarget); function processFolder(oSource, strTarget) { for (var ext in extArray) { var source = oSource.Path + "\\*." + extArray[ext]; try {fso.CopyFile(source, strTarget)} catch(e) {} } var subFolders = new Enumerator(oSource.SubFolders); for (; !subFolders.atEnd(); subFolders.moveNext()) { var target = strTarget + "\\" + subFolders.item().Name; processFolder(subFolders.item(), target) } } function processFolders(sourceArray, strTarget) { for (var index in sourceArray) { folder = fso.GetFolder(sourceArray[index]); processFolder(folder, strTarget) } } processFolders(sourceArray,strTarget); Сканируются папки указанные в массиве sourceArray на предмет наличия в них файлов с указанными расширениями. Найденные файлы перемещаются в папку target |
Проблема решена. Рекурсия работает правильно, локальные переменные сохраняются. Ошибка была в другом месте — функция CopyFile не копирует файл, если папка назначения не существует.
|
Часовой пояс GMT +3, время: 22:18. |