Что нового

[Файловая система] _FileListToArrayExt ()

Pelerin

Осваивающий
Сообщения
81
Репутация
23
Доброго времени суток!

Собственно, вот:
Изобрел велосипед, но с тремя колесами ;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 и т.п.)

Жду ваших комментариев, предложений и пожеланий.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Pelerin [?]
Изобрел велосипед, но с тремя колесами
Есть уже такой велосипед, при чём с 10-тью колёсами, и в несколько раз быстрее.
 
Автор
Pelerin

Pelerin

Осваивающий
Сообщения
81
Репутация
23
CreatoR
Есть уже такой велосипед, при чём с 10-тью колёсами, и в несколько раз быстрее.
А можно посмотреть? Я если честно не нашел... Хотя обычно просто использую коммандную строку.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Pelerin
ReDim с +1 наихудший вариант для цикла. Будет работать очень медленно, если предположительный результат больше 1000. Посмотри ссылку там ссылки на 6 вариантов подобных функций.
 
Верх