Что нового

[Файловая система] [Файловая система] Ошибка в FileGetAttrib на рекурсивном подъёме

Anton1982

Новичок
Сообщения
2
Репутация
0
Здравствуйте, уважаемые форумчане.

Решаю задачу обхода каталога и подкаталогов с целью обнаружения всех файлов. Формируется их перечень и сохраняется в log.txt. Следующий мой сценарий обнаруживает каталоги путём обнаружения «D» в строке атрибутов. К сожалению, на первом же рекурсивном подъёме, FileGetAttrib перестаёт возвращать атрибуты, а @error становится =1. Т.о. корректно обрабатывается только первая ветвь файловой структуры. Было бы достаточно уже понять причину такого поведения FileGetAttrib.

Комментировал много, т.к. моё знакомство с AutoIt продолжается всего второй день, наименования и приёмы пока не привычны.

Код:
;НАЧАЛО

Global $strFileList = "" ;Строка для накопления перечня файлов

$strDir = "D:\SANDBOXES\ARC" ;Определяем каталог, в котором находятся подкаталоги и файлы для обработки
_doScanAndProcess($strDir) ;запускаем процесс обработки

$txtFileList = FileOpen($strDir& "\log.txt", 2) ;В том же каталоге создаём текстовый файл для выгрузки перечня найденных файлов
If $txtFileList = -1 Then
	MsgBox(0, "Ошибка", "Не удалось открыть файл отчёта")
Else
	MsgBox(0,"",$strFileList)
	FileWrite($txtFileList, $strFileList) ; пишем перечень в текстовый файл
	FileClose($txtFileList) ;закрываем текстовый файл
EndIf

;КОНЕЦ

Func _doScanAndProcess($_strDir)
	;функция принимает начальный каталог, просматривает его и все подкаталоги. Перечисляет все файлы в каталогах в отдельном списке.
	FileChangeDir($_strDir) ;устанаваливаем текущй каталог на заданный параметров
	$initFSO = FileFindFirstFile("*.*") ; берём первый файловый объект

	local $strFSOAttrib = "" ;строка атрибутов текущего файла либо каталога
	local $flagDir = 0 ; флаг - 1, если текущий файловый объект - каталог, 0 - если это файл
	local $currentFSO  ; ссылка на текущий файловый объект, полученный в вызове FileFindNextFile($initFSO)

	While 1
		$currentFSO = FileFindNextFile($initFSO) ;принимаем ссылку на очередной файловый объект
		If @error Then ExitLoop ; здесь ошибка скорее всего означает, что файлы/каталоги кончились, выходим из цикла
		$strFSOAttrib = FileGetAttrib($currentFSO); ТУТ ВОЗНИКАЕТ ПРОБЛЕМА - не определяются атрибуты на рекурсивном возврате!
		$flagDir = StringRegExp ($strFSOAttrib, "[D]") ;Ищем признак каталога через регулярные выражения; Возврат:1 - каталог, 0 - не каталог
		if $flagDir = 1 Then
		 ; рекурсивное погружение в подкаталоги
		 _doScanAndProcess($_strDir &"\"& $currentFSO)
		Else
			$strFileList = $strFileList & "Файл:" & $currentFSO & @CRLF ;накапливаем список файлов
		EndIf

	WEnd

EndFunc


Поискал по форуму, нашёл похожие темы:

“Дерево папок и файлов !” (http://autoit-script.ru/index.php?topic=2588.15)
“Поиск файлов на диске” (http://autoit-script.ru/index.php/topic,315.0.html)

Во втором случае применяется _FileListToArray, можно будет и через такой подход реализовать. Просто меня заинтриговал вопрос – почему FileGetAttrib перестаёт в приведённом сценарии работать после рекурсивного возврата?

Спасибо.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Используешь функцию
Код:
_FileListToArrayRec

С параметрами поиска только папок или только файлов или и того и другого и всё. На форуме есть другие варианты функции поиска
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Anton1982 [?]
почему FileGetAttrib перестаёт в приведённом сценарии работать после рекурсивного возврата
Потому что путь не находит
Код:
$strFSOAttrib = FileGetAttrib($_strDir &"\"& $currentFSO)
Кстати, обратите внимание на второй параметр функции FileFindNextFile() ;)
Ну и при выходе из цикла не помешает
Код:
FileClose($initFSO)
 
Автор
A

Anton1982

Новичок
Сообщения
2
Репутация
0
Joiner, InnI, спасибо за ваши отклики!

Попробую проконтролировать результат FileFindNextFile() с учётом второго параметра = 0.
 
Верх