Advertisement
AZJIO

_FileFindNextFile

Sep 12th, 2013
755
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 13.39 KB | None | 0 0
  1. ; #EXAMPLE# ;=================================================================================
  2. #include <Array.au3>
  3.  
  4. Global $Lng[6]
  5. $Lng[1] = 'Error'
  6. $Lng[2] = 'Not a folder'
  7. $Lng[3] = 'Invalid mask'
  8. $Lng[4] = 'The folder is empty'
  9. $Lng[5] = 'sec'
  10.  
  11. If @OSLang = 0419 Then
  12.     $Lng[1] = 'Сообщение'
  13.     $Lng[2] = 'Не папка'
  14.     $Lng[3] = 'Неверная маска'
  15.     $Lng[4] = 'Папка пуста'
  16.     $Lng[5] = 'сек'
  17. EndIf
  18.  
  19. ; $search = _FileFindFirstFile(@WindowsDir, '*.tmp', 2)
  20. ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.exe')
  21. ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.dll', 0, 1)
  22. ; $search = _FileFindFirstFile('C:\Program Files\Internet Explorer', '*.dll|*.exe', 1, 1, 1)
  23. $search = _FileFindFirstFile(@WindowsDir, '*.dll|*.exe', 1, 1)
  24. If $search = -1 Then
  25.     $sTextError = ''
  26.     Switch @error
  27.         Case 1
  28.             $sTextError = $Lng[2] & '@error = ' & @error
  29.         Case 2
  30.             $sTextError = $Lng[3] & '@error = ' & @error
  31.         Case 3
  32.             $sTextError = $Lng[4] & '@error = ' & @error
  33.     EndSwitch
  34.     MsgBox(0, $Lng[1], $sTextError)
  35.     Exit
  36. EndIf
  37. ; _ArrayDisplay($search, 'Search, Array')
  38.  
  39. $timer = TimerInit()
  40. Local $sText, $iCount = 0, $sFileName
  41. While 1
  42.     $sFileName = _FileFindNextFile($search)
  43.     If @error Then ExitLoop
  44.     $sText &= $sFileName & @CRLF
  45.     $iCount += 1
  46.     ; If $iCount = 19 Then ExitLoop
  47. WEnd
  48. _FileFindClose($search)
  49. $timer = Round(TimerDiff($timer) / 1000, 2) & ' ' & $Lng[5]
  50. ; If @error Then MsgBox(0, $Lng[1], $Lng[1])
  51. ; If @extended Then MsgBox(0, @extended, @extended)
  52. MsgBox(0, $iCount & ', Time = ' & $timer, StringTrimRight($sText, 2))
  53. ; ============================================================================================
  54.  
  55.  
  56. ; #FUNCTION# ;=================================================================================
  57. ; Function Name ...: _FileFindFirstFile
  58. ; Description ........: Set the start searching files.
  59. ; Syntax................: _FileFindFirstFile ( $sPath [, $sMask = '*' [, $fInclude = 1 [, $iMode = 0 [, $iFull = 0 ]]]] )
  60. ; Parameters:
  61. ;       $sPath - Search path
  62. ;       $sMask - The mask using the characters "*" and "?" with the separator "|"
  63. ;       $fInclude - (0 / 1)
  64. ;                  |0 - Returns files, except specified in mask
  65. ;                  |1 - Returns the files specified in the mask
  66. ;       $iMode - (0,1,2) specifies whether to return files folders or both
  67. ;                  |0 - (Default) Return both files and folders
  68. ;                  |1 - Return files only
  69. ;                  |2 - Return Folders only
  70. ;       $iFull - (0,1,2,3)
  71. ;                  |0 - Relative
  72. ;                  |1 - Full path
  73. ; Return values ....: Success - Special array that is passed to subsequent calls _FileFindNextFile
  74. ;                   Failure -1, @error:
  75. ;                  |1 - Invalid path
  76. ;                  |2 - Invalid mask
  77. ;                  |3 - Not found
  78. ; Author(s) ..........: AZJIO, NIKZZZZ
  79. ; Remarks ..........: Use function _CorrectMask if it is required correct mask, which is entered by user
  80. ; ============================================================================================
  81. ; Имя функции ...: _FileFindFirstFile
  82. ; Описание ........: Задаёт начало поиска файлов.
  83. ; Синтаксис.......: _FileFindFirstFile ( $sPath [, $sMask = '*' [, $fInclude = 1 [, $iMode = 0 [, $iFull = 0 ]]]] )
  84. ; Параметры:
  85. ;       $sPath - Путь поиска
  86. ;       $sMask - Маска с использованием символов "*" и "?" с перечислением через "|"
  87. ;       $fInclude - (0 / 1)
  88. ;                  |0 - Возвращает файлы, кроме указанных в маски
  89. ;                  |1 - Возвращает файлы, указанные в маске
  90. ;       $iMode - (0,1,2) Определяет, какие элементы возвращать
  91. ;                  |0 - Файлы и папки
  92. ;                  |1 - Файлы
  93. ;                  |2 - Папки
  94. ;       $iFull - (0,1)
  95. ;                  |0 - Относительный
  96. ;                  |1 - Полный путь
  97. ; Возвращаемое значение: Успешно - Специальный массив, передаваемый для последующих вызовов _FileFindNextFile
  98. ;                   Неудачно  -1, @error:
  99. ;                  |1 - Неверный путь
  100. ;                  |2 - Неверная маска
  101. ;                  |3 - Ничего не найдено
  102. ; Автор ..........: AZJIO, NIKZZZZ
  103. ; Примечания ..: Используйте функцию _CorrectMask, если маска считывается из поля ввода и требуется проверка на корректность
  104. ; ============================================================================================
  105. ; Функция возвращает массив с дескриптором поиска и входными параметрами, для использования следующих запросов _FileFindNextFile
  106. Func _FileFindFirstFile($sPath, $sMask = '*', $fInclude = 1, $iMode = 0, $iFull = 0)
  107.     ; Коррекция маски и пути
  108.     ; $sMask = _CorrectMask($sMask)
  109.     If $sMask = '|' Then Return SetError(2, 0, -1) ; Неверная маска
  110.     ; MsgBox(0, 'sPath', $sPath)
  111.     If Not _IsDir($sPath) Then Return SetError(1, 0, -1) ; Каталог не является папкой
  112.     If StringRight($sPath, 1) <> '\' Then $sPath &= '\' ; Корректируем формат пути
  113.  
  114.     Local $hSearch = FileFindFirstFile($sPath & "*") ; Дескриптор начала поиска
  115.     If $hSearch = -1 Then Return SetError(3, 0, -1) ; Папка пуста
  116.  
  117.     Local $aSearch[130][2] ; Максимальный размер
  118.  
  119.     ; Обработка результата поиска по маске
  120.     If $sMask <> '*' Then $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][$^.{}()+]', '\\$0'), '?', '.'), '*', '.*?') ; Формирует маску
  121.     $aSearch[0][0] = 6 ; начало отсчёта (первые 5*2 элемента массива определяют входные параметры поиска)
  122.         $aSearch[0][1] = $sMask
  123.     $aSearch[1][0] = $fInclude
  124.         $aSearch[1][1] = $iMode
  125.     $aSearch[2][0] = $iFull
  126.         $aSearch[2][1] = StringLen($sPath)
  127.  
  128.     $aSearch[$aSearch[0][0]][0] = $hSearch
  129.     $aSearch[$aSearch[0][0]][1] = $sPath ; Путь начала поиска
  130.     Return $aSearch
  131. EndFunc   ;==>_FileFindFirstFile
  132.  
  133.  
  134.  
  135.  
  136.  
  137. ; #FUNCTION# ;=================================================================================
  138. ; Function Name ...: _FileFindNextFile
  139. ; AutoIt Version ....: 3.3.2.0+ , versions below this @extended should be replaced by of StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  140. ; Description ........: Requests the next file
  141. ; Syntax................: _FileFindNextFile ( $aSearch )
  142. ; Parameters:
  143. ;       $aSearch - The array returned by the _FileFindFirstFile function
  144. ; Return values ....: Success - Returns the file
  145. ;                   Failure -1, @error:
  146. ;                  |1 - Search is complete
  147. ; Author(s) ..........: AZJIO, NIKZZZZ
  148. ; ============================================================================================
  149. ; Имя функции ...: _FileFindNextFile
  150. ; Версия AutoIt ..: 3.3.2.0+ , в версиях ниже указанной нужно @extended заменить на StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  151. ; Описание ........: Запрашивает следующий файл
  152. ; Синтаксис.......: _FileFindNextFile ( $aSearch )
  153. ; Параметры:
  154. ;       $aSearch - Массив возвращённый функцией _FileFindFirstFile
  155. ; Возвращаемое значение: Успешно - Возвращает файл
  156. ;                   Неудачно  -1, @error:
  157. ;                  |1 - Поиск завёршён
  158. ; Автор ..........: AZJIO, NIKZZZZ
  159. ; ============================================================================================
  160. Func _FileFindNextFile(ByRef $aSearch) 
  161.     Local $sName
  162.     Do
  163.         $sName = FileFindNextFile($aSearch[ $aSearch[0][0] ][0]) ; Следующий файл по дескриптору
  164.         If @error Then
  165.             FileClose($aSearch[ $aSearch[0][0] ][0]) ; Закрываем текущий дескриптор поиска и переходим к предыдущему
  166.             $aSearch[0][0] -= 1
  167.             ContinueLoop
  168.         Else
  169.             If @extended Then ; Если папка, то
  170.                 $aSearch[0][0] += 1 ; Увеличиваем счётчик. Добавляем новый путь и дескриптор поиска
  171.                 $aSearch[$aSearch[0][0]][1] = $aSearch[$aSearch[0][0] - 1][1] & $sName & "\"
  172.                 $aSearch[$aSearch[0][0]][0] = FileFindFirstFile($aSearch[$aSearch[0][0]][1] & "*")
  173.                 If ($aSearch[1][1] = 0 Or $aSearch[1][1] = 2) And StringRegExp($sName, '(?i)^(?:' & $aSearch[0][1] & ')$') = $aSearch[1][0] Then
  174.                     If $aSearch[2][0] Then ; Full
  175.                         Return $aSearch[$aSearch[0][0] - 1][1] & $sName ; Если флаг требует добавить папку, то она добавляется к списку
  176.                     Else
  177.                         Return StringTrimLeft($aSearch[$aSearch[0][0] - 1][1] & $sName, $aSearch[2][1]) ; Относительный путь
  178.                     EndIf
  179.                 Else
  180.                     ContinueLoop ; Иначе делаем новый запрос
  181.                 EndIf
  182.             Else
  183.                 If ($aSearch[1][1] = 0 Or $aSearch[1][1] = 1) And StringRegExp($sName, '(?i)^(?:' & $aSearch[0][1] & ')$') = $aSearch[1][0] Then
  184.                     If $aSearch[2][0] Then ; Full
  185.                         Return $aSearch[$aSearch[0][0]][1] & $sName ; Если флаг требует добавить файл, то она добавляется к списку
  186.                     Else
  187.                         Return StringTrimLeft($aSearch[$aSearch[0][0]][1] & $sName, $aSearch[2][1]) ; Относительный путь
  188.                     EndIf
  189.                 Else
  190.                     ContinueLoop ; Иначе делаем новый запрос
  191.                 EndIf
  192.             EndIf
  193.         EndIf
  194.     Until $aSearch[0][0] < 6
  195.     Return SetError(1, 0, '') ; Поиск завершён естественным способом (файлы закончились)
  196. EndFunc   ;==>_FileFindNextFile
  197.  
  198. ; #FUNCTION# ;=================================================================================
  199. ; Function Name ...: _FileFindClose
  200. ; Description ........: Closes search
  201. ; Syntax................: _FileFindClose ( $aSearch )
  202. ; Parameters:
  203. ;       $aSearch - The array returned by the _FileFindFirstFile function
  204. ; Return values ....: Success - 0
  205. ;                   Failure Returns the number of errors , @ error duplicates the return value
  206. ;                   Failure -1, @error: -1, If the passed array does not fit
  207. ; Author(s) ..........: AZJIO, NIKZZZZ
  208. ; Remarks ..........: If the search has ended naturally, it is not necessary to use this function. It is enough to clear the array ($aSearch = '').
  209. ; ============================================================================================
  210. ; Имя функции ...: _FileFindClose
  211. ; Описание ........: Закрывает поиск
  212. ; Синтаксис.......: _FileFindClose ( $aSearch )
  213. ; Параметры:
  214. ;       $aSearch - Массив возвращённый функцией _FileFindFirstFile
  215. ; Возвращаемое значение: Успешно - 0
  216. ;                   Неудачно  Возвращает число ошибок, @error дублирует возвращаемое значение
  217. ;                   Неудачно  -1, @error = -1, если переданный массив не соответствует формату
  218. ; Автор ..........: AZJIO, NIKZZZZ
  219. ; Примечания ..: Если поиск закончился естественным путём, то не требуется использовать эту функцию. Достаточно очистить массив ($aSearch = '').
  220. ; ============================================================================================
  221. Func _FileFindClose(ByRef $aSearch)
  222.     Local $iError = 0, $iCount = 0
  223.     ; Если не мессив или размерность не 2 или размер1 более 130 или размер2 более 2 или индекс больше чем размер массива, то вывод ошибки "Неверный входной параметр"
  224.     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
  225.         $aSearch = ''
  226.         Return SetError(-1, 0, -1)
  227.     EndIf
  228.     For $i = 6 To $aSearch[0][0]
  229.         If Not FileClose($aSearch[$i][0]) Then $iError += 1
  230.         $iCount += 1
  231.     Next
  232.     $aSearch = ''
  233.     Return SetError($iError, $iCount, $iError)
  234. EndFunc   ;==>_FileFindClose
  235.  
  236. ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
  237. Func _IsDir($sTmp)
  238.     $sTmp = FileGetAttrib($sTmp)
  239.     Return SetError(@error, 0, StringInStr($sTmp, 'D', 2) > 0)
  240. EndFunc   ;==>_FO_IsDir
  241.  
  242. ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
  243. Func _CorrectMask($sMask)
  244.     If Not $sMask Then Return SetError(2, 0, '|')
  245.     If StringRegExp($sMask, '[\\/:"<>]') Then Return SetError(2, 0, '|')
  246.     If StringInStr($sMask, '**') Then $sMask = StringRegExpReplace($sMask, '\*+', '*')
  247.     If StringRegExp($sMask & '|', '[\s|.]\|') Then $sMask = StringRegExpReplace($sMask & '|', '[\s|.]+\|', '|')
  248.     If StringInStr('|' & $sMask & '|', '|*|') Then Return '*'
  249.     If $sMask = '|' Then Return SetError(2, 0, '|')
  250.     If StringRight($sMask, 1) = '|' Then $sMask = StringTrimRight($sMask, 1)
  251.     If StringLeft($sMask, 1) = '|' Then $sMask = StringTrimLeft($sMask, 1)
  252.     Return $sMask
  253. EndFunc   ;==>_CorrectMask
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement