Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.03.2012, 19:45
Новичок на форуме
Отправить личное сообщение для salikoff Посмотреть профиль Найти все сообщения от salikoff
 
Регистрация: 24.09.2011
Сообщений: 7

Рекурсия перезаписывает локальные переменные! Почему?
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 перед определением переменной. Как этого избежать? Ничего не понимаю. Прошу вашего совета, дамы и господа.
Ответить с цитированием
  #2 (permalink)  
Старый 31.03.2012, 21:13
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

замените все subFolders на processFolder.subFolders и уберите var
Ответить с цитированием
  #3 (permalink)  
Старый 31.03.2012, 22:01
Новичок на форуме
Отправить личное сообщение для salikoff Посмотреть профиль Найти все сообщения от salikoff
 
Регистрация: 24.09.2011
Сообщений: 7

Рекомендуемый Вами приём ровным счётом ничего не меняет, локальная переменная всё равно перезаписывается.
Ответить с цитированием
  #4 (permalink)  
Старый 31.03.2012, 22:03
Новичок на форуме
Отправить личное сообщение для salikoff Посмотреть профиль Найти все сообщения от salikoff
 
Регистрация: 24.09.2011
Сообщений: 7

Попробовал ещё одно ухищрение — рекурсивный вызов через arguments.callee. Ситуация не изменилась.
Ответить с цитированием
  #5 (permalink)  
Старый 31.03.2012, 22:07
Новичок на форуме
Отправить личное сообщение для salikoff Посмотреть профиль Найти все сообщения от salikoff
 
Регистрация: 24.09.2011
Сообщений: 7

вот более полная версия скрипта, для тех, кто хочет запустить его на исполнение:
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

Последний раз редактировалось salikoff, 31.03.2012 в 22:11.
Ответить с цитированием
  #6 (permalink)  
Старый 31.03.2012, 23:43
Новичок на форуме
Отправить личное сообщение для salikoff Посмотреть профиль Найти все сообщения от salikoff
 
Регистрация: 24.09.2011
Сообщений: 7

Проблема решена. Рекурсия работает правильно, локальные переменные сохраняются. Ошибка была в другом месте — функция CopyFile не копирует файл, если папка назначения не существует.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать 2 локальные переменные? 9xakep Общие вопросы Javascript 2 26.07.2011 17:53
глобальные и локальные переменные San4ezy Элементы интерфейса 4 10.10.2010 19:23