Pelerin
Осваивающий
- Сообщения
- 81
- Репутация
- 23
Доброго времени суток!
Собственно, вот:
Изобрел велосипед, но с тремя колесами ;D.
В отличие от _FileListToArray () умеет сканировать вложенные папки.
Плюс - возвращает красивый массив в ANSI кодировке (в отличие от "Dir /b /s")
Минус - медленновато работает с большими папками (типа @WindowsDir и т.п.)
Жду ваших комментариев, предложений и пожеланий.
Собственно, вот:
Изобрел велосипед, но с тремя колесами ;D.
В отличие от _FileListToArray () умеет сканировать вложенные папки.
Код:
Func _FileListToArrayExt($root, $ext, $attrib='[RASHNDOCT]', $sub=False)
If Not FileExists($root) Then Return 0
If StringRight($root, 1) = '\' Then $root = StringTrimRight($root, 1)
If Not StringRegExp($ext, '(.*)\.(.*)') Then Return 0
Local $dir_list[2] = [1, $root], $file_list[1]
If $Sub Then
$find_first = FileFindFirstFile ($dir_list[1]&'\'&'*.*')
Do
$find=FileFindNextFile($find_first)
If Not @error Then
If @extended Then
$dir_list[0] += 1
ReDim $dir_list[$dir_list[0]+1]
$dir_list[$dir_list[0]] = $root&'\'&$find
EndIf
EndIf
Until @error
$i = 2
Do
$find_first = FileFindFirstFile ($dir_list[$i]&'\'&'*.*')
Do
$find=FileFindNextFile($find_first)
If Not @error Then
If @extended Then
$dir_list[0] += 1
ReDim $dir_list[$dir_list[0]+1]
$dir_list[$dir_list[0]] = $dir_list[$i]&'\'&$find
EndIf
EndIf
Until @error
$i+=1
Until $i>$dir_list[0]
EndIf
For $i = 1 to $dir_list[0]
$find_first = FileFindFirstFile ($dir_list[$i]&'\'&$ext)
Do
$find=FileFindNextFile($find_first)
If Not @error Then
$file_attrib = FileGetAttrib($dir_list[$i]&'\'&$find)
If StringRegExp ($file_attrib, $attrib) Then
$file_list[0]+=1
ReDim $file_list[$file_list[0]+1]
$file_list[$file_list[0]] = $dir_list[$i]&'\'&$find
EndIf
EndIf
Until @error
Next
Return $file_list
EndFunc
$root | Путь для поиска |
$ext | Маска расширения для поиска |
$attrib='[RASHNDOCT]' | [Опционально] Маска атрибутов. Поддерживает регулярные выражения. Значения атрибутов идентичны тому что возвращает FileGetAttrib (). Умолчание - любой |
$sub=False | [Опционально] Если True, тогда сканируются вложенные папки\файлы, иначе только один уровень. Умолчание - False |
Код:
#include <array.au3>
$list= _FileListToArrayExt(@WindowsDir, '*.exe', '', True)
If IsArray($list) Then
_ArrayDisplay($list, '$list')
Else
MsgBox(0, @ScriptName&' - Return:', $list)
EndIf
Exit
;====================
Func _FileListToArrayExt($root, $ext, $attrib='[RASHNDOCT]', $sub=False)
If Not FileExists($root) Then Return 0
If StringRight($root, 1) = '\' Then $root = StringTrimRight($root, 1)
If Not StringRegExp($ext, '(.*)\.(.*)') Then Return 0
Local $dir_list[2] = [1, $root], $file_list[1]
If $Sub Then
$find_first = FileFindFirstFile ($dir_list[1]&'\'&'*.*')
Do
$find=FileFindNextFile($find_first)
If Not @error Then
If @extended Then
$dir_list[0] += 1
ReDim $dir_list[$dir_list[0]+1]
$dir_list[$dir_list[0]] = $root&'\'&$find
EndIf
EndIf
Until @error
$i = 2
Do
$find_first = FileFindFirstFile ($dir_list[$i]&'\'&'*.*')
Do
$find=FileFindNextFile($find_first)
If Not @error Then
If @extended Then
$dir_list[0] += 1
ReDim $dir_list[$dir_list[0]+1]
$dir_list[$dir_list[0]] = $dir_list[$i]&'\'&$find
EndIf
EndIf
Until @error
$i+=1
Until $i>$dir_list[0]
EndIf
For $i = 1 to $dir_list[0]
$find_first = FileFindFirstFile ($dir_list[$i]&'\'&$ext)
Do
$find=FileFindNextFile($find_first)
If Not @error Then
$file_attrib = FileGetAttrib($dir_list[$i]&'\'&$find)
If StringRegExp ($file_attrib, $attrib) Then
$file_list[0]+=1
ReDim $file_list[$file_list[0]+1]
$file_list[$file_list[0]] = $dir_list[$i]&'\'&$find
EndIf
EndIf
Until @error
Next
Return $file_list
EndFunc
Плюс - возвращает красивый массив в ANSI кодировке (в отличие от "Dir /b /s")
Минус - медленновато работает с большими папками (типа @WindowsDir и т.п.)
Жду ваших комментариев, предложений и пожеланий.