Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; #EXAMPLE# ;=================================================================================
- #include <Array.au3>
- Global $Lng[6]
- $Lng[1] = 'Error'
- $Lng[2] = 'Not a folder'
- $Lng[3] = 'Invalid mask'
- $Lng[4] = 'The folder is empty'
- $Lng[5] = 'sec'
- If @OSLang = 0419 Then
- $Lng[1] = 'Сообщение'
- $Lng[2] = 'Не папка'
- $Lng[3] = 'Неверная маска'
- $Lng[4] = 'Папка пуста'
- $Lng[5] = 'сек'
- EndIf
- ; $search = _FileFindFirstFile(@WindowsDir, '*.tmp', 2)
- ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.exe')
- ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.dll', 0, 1)
- ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.dll|*.exe', 1, 1, 1)
- $search = _FileFindFirstFile(@WindowsDir, '*.dll|*.exe', 1, 1)
- If $search = -1 Then
- $sTextError = ''
- Switch @error
- Case 1
- $sTextError = $Lng[2] & '@error = ' & @error
- Case 2
- $sTextError = $Lng[3] & '@error = ' & @error
- Case 3
- $sTextError = $Lng[4] & '@error = ' & @error
- EndSwitch
- MsgBox(0, $Lng[1], $sTextError)
- Exit
- EndIf
- ; _ArrayDisplay($search, 'Search, Array')
- $timer = TimerInit()
- Local $sText, $iCount = 0, $sFileName
- While 1
- $sFileName = _FileFindNextFile($search)
- If @error Then ExitLoop
- $sText &= $sFileName & @CRLF
- $iCount += 1
- ; If $iCount = 19 Then ExitLoop
- WEnd
- _FileFindClose($search)
- $timer = Round(TimerDiff($timer) / 1000, 2) & ' ' & $Lng[5]
- ; If @error Then MsgBox(0, $Lng[1], $Lng[1])
- ; If @extended Then MsgBox(0, @extended, @extended)
- MsgBox(0, $iCount & ', Time = ' & $timer, StringTrimRight($sText, 2))
- ; ============================================================================================
- ; #FUNCTION# ;=================================================================================
- ; Function Name ...: _FileFindFirstFile
- ; Description ........: Set the start searching files.
- ; Syntax................: _FileFindFirstFile ( $sPath [, $sMask = '*' [, $fInclude = 1 [, $iMode = 0 [, $iFull = 0 ]]]] )
- ; Parameters:
- ; $sPath - Search path
- ; $sMask - The mask using the characters "*" and "?" with the separator "|"
- ; $fInclude - (0 / 1)
- ; |0 - Returns files, except specified in mask
- ; |1 - Returns the files specified in the mask
- ; $iMode - (0,1,2) specifies whether to return files folders or both
- ; |0 - (Default) Return both files and folders
- ; |1 - Return files only
- ; |2 - Return Folders only
- ; $iFull - (0,1,2,3)
- ; |0 - Relative
- ; |1 - Full path
- ; Return values ....: Success - Special array that is passed to subsequent calls _FileFindNextFile
- ; Failure -1, @error:
- ; |1 - Invalid path
- ; |2 - Invalid mask
- ; |3 - Not found
- ; Author(s) ..........: AZJIO, NIKZZZZ
- ; Remarks ..........: Use function _CorrectMask if it is required correct mask, which is entered by user
- ; ============================================================================================
- ; Имя функции ...: _FileFindFirstFile
- ; Описание ........: Задаёт начало поиска файлов.
- ; Синтаксис.......: _FileFindFirstFile ( $sPath [, $sMask = '*' [, $fInclude = 1 [, $iMode = 0 [, $iFull = 0 ]]]] )
- ; Параметры:
- ; $sPath - Путь поиска
- ; $sMask - Маска с использованием символов "*" и "?" с перечислением через "|"
- ; $fInclude - (0 / 1)
- ; |0 - Возвращает файлы, кроме указанных в маски
- ; |1 - Возвращает файлы, указанные в маске
- ; $iMode - (0,1,2) Определяет, какие элементы возвращать
- ; |0 - Файлы и папки
- ; |1 - Файлы
- ; |2 - Папки
- ; $iFull - (0,1)
- ; |0 - Относительный
- ; |1 - Полный путь
- ; Возвращаемое значение: Успешно - Специальный массив, передаваемый для последующих вызовов _FileFindNextFile
- ; Неудачно -1, @error:
- ; |1 - Неверный путь
- ; |2 - Неверная маска
- ; |3 - Ничего не найдено
- ; Автор ..........: AZJIO, NIKZZZZ
- ; Примечания ..: Используйте функцию _CorrectMask, если маска считывается из поля ввода и требуется проверка на корректность
- ; ============================================================================================
- ; Функция возвращает массив с дескриптором поиска и входными параметрами, для использования следующих запросов _FileFindNextFile
- Func _FileFindFirstFile($sPath, $sMask = '*', $fInclude = 1, $iMode = 0, $iFull = 0)
- ; Коррекция маски и пути
- ; $sMask = _CorrectMask($sMask)
- If $sMask = '|' Then Return SetError(2, 0, -1) ; Неверная маска
- ; MsgBox(0, 'sPath', $sPath)
- If Not _IsDir($sPath) Then Return SetError(1, 0, -1) ; Каталог не является папкой
- If StringRight($sPath, 1) <> '\' Then $sPath &= '\' ; Корректируем формат пути
- Local $hSearch = FileFindFirstFile($sPath & "*") ; Дескриптор начала поиска
- If $hSearch = -1 Then Return SetError(3, 0, -1) ; Папка пуста
- Local $aSearch[130][2] ; Максимальный размер
- ; Обработка результата поиска по маске
- If $sMask <> '*' Then $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][$^.{}()+]', '\\$0'), '?', '.'), '*', '.*?') ; Формирует маску
- $aSearch[0][0] = 6 ; начало отсчёта (первые 5*2 элемента массива определяют входные параметры поиска)
- $aSearch[0][1] = $sMask
- $aSearch[1][0] = $fInclude
- $aSearch[1][1] = $iMode
- $aSearch[2][0] = $iFull
- $aSearch[2][1] = StringLen($sPath)
- $aSearch[$aSearch[0][0]][0] = $hSearch
- $aSearch[$aSearch[0][0]][1] = $sPath ; Путь начала поиска
- Return $aSearch
- EndFunc ;==>_FileFindFirstFile
- ; #FUNCTION# ;=================================================================================
- ; Function Name ...: _FileFindNextFile
- ; AutoIt Version ....: 3.3.2.0+ , versions below this @extended should be replaced by of StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
- ; Description ........: Requests the next file
- ; Syntax................: _FileFindNextFile ( $aSearch )
- ; Parameters:
- ; $aSearch - The array returned by the _FileFindFirstFile function
- ; Return values ....: Success - Returns the file
- ; Failure -1, @error:
- ; |1 - Search is complete
- ; Author(s) ..........: AZJIO, NIKZZZZ
- ; ============================================================================================
- ; Имя функции ...: _FileFindNextFile
- ; Версия AutoIt ..: 3.3.2.0+ , в версиях ниже указанной нужно @extended заменить на StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
- ; Описание ........: Запрашивает следующий файл
- ; Синтаксис.......: _FileFindNextFile ( $aSearch )
- ; Параметры:
- ; $aSearch - Массив возвращённый функцией _FileFindFirstFile
- ; Возвращаемое значение: Успешно - Возвращает файл
- ; Неудачно -1, @error:
- ; |1 - Поиск завёршён
- ; Автор ..........: AZJIO, NIKZZZZ
- ; ============================================================================================
- Func _FileFindNextFile(ByRef $aSearch)
- Local $sName
- Do
- $sName = FileFindNextFile($aSearch[ $aSearch[0][0] ][0]) ; Следующий файл по дескриптору
- If @error Then
- FileClose($aSearch[ $aSearch[0][0] ][0]) ; Закрываем текущий дескриптор поиска и переходим к предыдущему
- $aSearch[0][0] -= 1
- ContinueLoop
- Else
- If @extended Then ; Если папка, то
- $aSearch[0][0] += 1 ; Увеличиваем счётчик. Добавляем новый путь и дескриптор поиска
- $aSearch[$aSearch[0][0]][1] = $aSearch[$aSearch[0][0] - 1][1] & $sName & "\"
- $aSearch[$aSearch[0][0]][0] = FileFindFirstFile($aSearch[$aSearch[0][0]][1] & "*")
- If ($aSearch[1][1] = 0 Or $aSearch[1][1] = 2) And StringRegExp($sName, '(?i)^(?:' & $aSearch[0][1] & ')$') = $aSearch[1][0] Then
- If $aSearch[2][0] Then ; Full
- Return $aSearch[$aSearch[0][0] - 1][1] & $sName ; Если флаг требует добавить папку, то она добавляется к списку
- Else
- Return StringTrimLeft($aSearch[$aSearch[0][0] - 1][1] & $sName, $aSearch[2][1]) ; Относительный путь
- EndIf
- Else
- ContinueLoop ; Иначе делаем новый запрос
- EndIf
- Else
- If ($aSearch[1][1] = 0 Or $aSearch[1][1] = 1) And StringRegExp($sName, '(?i)^(?:' & $aSearch[0][1] & ')$') = $aSearch[1][0] Then
- If $aSearch[2][0] Then ; Full
- Return $aSearch[$aSearch[0][0]][1] & $sName ; Если флаг требует добавить файл, то она добавляется к списку
- Else
- Return StringTrimLeft($aSearch[$aSearch[0][0]][1] & $sName, $aSearch[2][1]) ; Относительный путь
- EndIf
- Else
- ContinueLoop ; Иначе делаем новый запрос
- EndIf
- EndIf
- EndIf
- Until $aSearch[0][0] < 6
- Return SetError(1, 0, '') ; Поиск завершён естественным способом (файлы закончились)
- EndFunc ;==>_FileFindNextFile
- ; #FUNCTION# ;=================================================================================
- ; Function Name ...: _FileFindClose
- ; Description ........: Closes search
- ; Syntax................: _FileFindClose ( $aSearch )
- ; Parameters:
- ; $aSearch - The array returned by the _FileFindFirstFile function
- ; Return values ....: Success - 0
- ; Failure Returns the number of errors , @ error duplicates the return value
- ; Failure -1, @error: -1, If the passed array does not fit
- ; Author(s) ..........: AZJIO, NIKZZZZ
- ; Remarks ..........: If the search has ended naturally, it is not necessary to use this function. It is enough to clear the array ($aSearch = '').
- ; ============================================================================================
- ; Имя функции ...: _FileFindClose
- ; Описание ........: Закрывает поиск
- ; Синтаксис.......: _FileFindClose ( $aSearch )
- ; Параметры:
- ; $aSearch - Массив возвращённый функцией _FileFindFirstFile
- ; Возвращаемое значение: Успешно - 0
- ; Неудачно Возвращает число ошибок, @error дублирует возвращаемое значение
- ; Неудачно -1, @error = -1, если переданный массив не соответствует формату
- ; Автор ..........: AZJIO, NIKZZZZ
- ; Примечания ..: Если поиск закончился естественным путём, то не требуется использовать эту функцию. Достаточно очистить массив ($aSearch = '').
- ; ============================================================================================
- Func _FileFindClose(ByRef $aSearch)
- Local $iError = 0, $iCount = 0
- ; Если не мессив или размерность не 2 или размер1 более 130 или размер2 более 2 или индекс больше чем размер массива, то вывод ошибки "Неверный входной параметр"
- If Not IsArray($aSearch) Or UBound($aSearch, 0) <> 2 Or UBound($aSearch) > 130 Or UBound($aSearch, 2) > 2 Or $aSearch[0][0] > UBound($aSearch) - 1 Then
- $aSearch = ''
- Return SetError(-1, 0, -1)
- EndIf
- For $i = 6 To $aSearch[0][0]
- If Not FileClose($aSearch[$i][0]) Then $iError += 1
- $iCount += 1
- Next
- $aSearch = ''
- Return SetError($iError, $iCount, $iError)
- EndFunc ;==>_FileFindClose
- ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
- Func _IsDir($sTmp)
- $sTmp = FileGetAttrib($sTmp)
- Return SetError(@error, 0, StringInStr($sTmp, 'D', 2) > 0)
- EndFunc ;==>_FO_IsDir
- ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
- Func _CorrectMask($sMask)
- If Not $sMask Then Return SetError(2, 0, '|')
- If StringRegExp($sMask, '[\\/:"<>]') Then Return SetError(2, 0, '|')
- If StringInStr($sMask, '**') Then $sMask = StringRegExpReplace($sMask, '\*+', '*')
- If StringRegExp($sMask & '|', '[\s|.]\|') Then $sMask = StringRegExpReplace($sMask & '|', '[\s|.]+\|', '|')
- If StringInStr('|' & $sMask & '|', '|*|') Then Return '*'
- If $sMask = '|' Then Return SetError(2, 0, '|')
- If StringRight($sMask, 1) = '|' Then $sMask = StringTrimRight($sMask, 1)
- If StringLeft($sMask, 1) = '|' Then $sMask = StringTrimLeft($sMask, 1)
- Return $sMask
- EndFunc ;==>_CorrectMask
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement