Здравствуйте, уважаемые форумчане.
Решаю задачу обхода каталога и подкаталогов с целью обнаружения всех файлов. Формируется их перечень и сохраняется в log.txt. Следующий мой сценарий обнаруживает каталоги путём обнаружения «D» в строке атрибутов. К сожалению, на первом же рекурсивном подъёме, FileGetAttrib перестаёт возвращать атрибуты, а @error становится =1. Т.о. корректно обрабатывается только первая ветвь файловой структуры. Было бы достаточно уже понять причину такого поведения FileGetAttrib.
Комментировал много, т.к. моё знакомство с AutoIt продолжается всего второй день, наименования и приёмы пока не привычны.
Поискал по форуму, нашёл похожие темы:
“Дерево папок и файлов !” (http://autoit-script.ru/index.php?topic=2588.15)
“Поиск файлов на диске” (http://autoit-script.ru/index.php/topic,315.0.html)
Во втором случае применяется _FileListToArray, можно будет и через такой подход реализовать. Просто меня заинтриговал вопрос – почему FileGetAttrib перестаёт в приведённом сценарии работать после рекурсивного возврата?
Спасибо.
Решаю задачу обхода каталога и подкаталогов с целью обнаружения всех файлов. Формируется их перечень и сохраняется в 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 перестаёт в приведённом сценарии работать после рекурсивного возврата?
Спасибо.