Рекурсия перезаписывает локальные переменные! Почему?
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, время: 17:24. |