Advertisement
AZJIO

FileOperations.au3

Sep 16th, 2011
2,348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 53.68 KB | None | 0 0
  1. #include-once
  2. #include <Date.au3> ; _FO_FileBackup
  3.  
  4. ; FileOperations.au3
  5. ; версия 1.8.3 от 2014.03.18
  6.  
  7. ; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
  8. ; http://pastebin.com/AbzMyg1x
  9. ; http://azjio.ucoz.ru/publ/skripty_autoit3/funkcii/filesearch/11-1-0-33
  10.  
  11. ; =======================================
  12. ; Title .........: FileOperations
  13. ; AutoIt Version : 3.3.2.0 - 3.3.8.1
  14. ; Language ......: English + Русский
  15. ; Description ...: Operations with files
  16. ; =======================================
  17.  
  18. ; #CURRENT# =============================
  19. ; _FO_CorrectMask
  20. ; _FO_FileSearch
  21. ; _FO_FolderSearch
  22. ; _FO_SearchEmptyFolders
  23. ; _FO_FileDirReName
  24. ; _FO_GetCopyName
  25. ; _FO_FileBackup
  26. ; _FO_PathSplit
  27. ; _FO_IsDir
  28. ; _FO_ShortFileSize
  29. ; _FO_IsEmptyFolder
  30. ; =======================================
  31.  
  32. ; Внутренние функции
  33. ; #INTERNAL_USE_ONLY#====================
  34. ; __FO_FileSearchType
  35. ; __FO_FileSearchMask
  36. ; __FO_FileSearchAll
  37. ; __FO_GetListMask
  38. ; __FO_MaskUnique (#Obfuscator_Off и #Obfuscator_On)
  39. ; __FO_FolderSearch
  40. ; __FO_FolderSearchMask
  41. ; __FO_SearchEmptyFolders1
  42. ; __FO_SearchEmptyFolders2
  43. ; __FO_UserLocale
  44. ; __ChExcludeFolders
  45. ; =======================================
  46.  
  47. ; #FUNCTION# ;=================================================================================
  48. ; Function Name ...: _FO_FileSearch (__FO_FileSearchType, __FO_FileSearchMask, __FO_FileSearchAll)
  49. ; AutoIt Version ....: 3.3.2.0+ , versions below this @extended should be replaced by of StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  50. ; Description ........: Search files by mask in subdirectories.
  51. ; Syntax................: _FO_FileSearch ( $sPath [, $sMask = '*' [, $fInclude=True [, $iDepth=125 [, $iFull=1 [, $iArray=1 [, $iTypeMask=1 [, $sLocale=0[, $vExcludeFolders = ''[, $iExcludeDepth = -1]]]]]]]]] )
  52. ; Parameters:
  53. ;       $sPath - Search path
  54. ;       $sMask - Allowed two options for the mask: using symbols "*" and "?" with the separator "|", or a list of extensions with the separator "|"
  55. ;       $fInclude - (True / False) Invert the mask, that is excluded from the search for these types of files
  56. ;       $iDepth - (0-125) Nesting level (0 - root directory)
  57. ;       $iFull - (0,1,2,3)
  58. ;                  |0 - Relative
  59. ;                  |1 - Full path
  60. ;                  |2 - File names with extension
  61. ;                  |3 - File names without extension
  62. ;       $iArray - if the value other than zero, the result is an array (by default ),
  63. ;                  |0 - A list of paths separated by @CRLF
  64. ;                  |1 - Array, where $iArray[0]=number of files ( by default)
  65. ;                  |2 - Array, where $iArray[0] contains the first file
  66. ;       $iTypeMask - (0,1,2) defines the format mask
  67. ;                  |0 - Auto detect
  68. ;                  |1 - Forced mask, for example *.is?|s*.cp* (it is possible to specify a file name with no characters * or ? and no extension will be found)
  69. ;                  |2 - Forced mask, for example tmp|bak|gid (that is, only files with the specified extension)
  70. ;       $sLocale - Case sensitive.
  71. ;                  |-1 - Not case sensitive (only for 'A-z').
  72. ;                  |0 - Not case sensitive, by default. (for any characters)
  73. ;                  |1 - Case sensitive (for any characters)
  74. ;                  |<symbols> - not case sensitive, specified range of characters from local languages. For example 'А-яЁё'. 'A-z' is not required, they are enabled by default.
  75. ;       $vExcludeFolders - Excludes folders from search. List the folder names via the "|", for example, "Name1|Name2|Name3|".
  76. ;       $iExcludeDepth - Nesting level for the parameter $vExcludeFolders. -1 by default, which means disabled.
  77. ; Return values ....: Success - Array or a list of paths separated by @CRLF
  78. ;                   Failure - Empty string, @error:
  79. ;                  |0 - No error
  80. ;                  |1 - Invalid path
  81. ;                  |2 - Invalid mask
  82. ;                  |3 - Not found
  83. ; Author(s) ..........: AZJIO
  84. ; Remarks ..........: Use function _CorrectMask if it is required correct mask, which is entered by user
  85. ; ============================================================================================
  86. ; Имя функции ...: _FO_FileSearch (__FO_FileSearchType, __FO_FileSearchMask, __FO_FileSearchAll)
  87. ; Версия AutoIt ..: 3.3.2.0+ , в версиях ниже указанной нужно @extended заменить на StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  88. ; Описание ........: Поиск файлов по маске в подкаталогах.
  89. ; Синтаксис.......: _FO_FileSearch ( $sPath [, $sMask = '*' [, $fInclude=True [, $iDepth=125 [, $iFull=1 [, $iArray=1 [, $iTypeMask=1 [, $sLocale=0[, $vExcludeFolders = ''[, $iExcludeDepth = -1]]]]]]]]] )
  90. ; Параметры:
  91. ;       $sPath - Путь поиска
  92. ;       $sMask - Допустимы два варианта маски: с использованием символов "*" и "?" с перечислением через "|", либо перечисление расширений через "|"
  93. ;       $fInclude - (True / False) Инвертировать маску, то есть исключить из поиска указанные типы файлов
  94. ;       $iDepth - (0-125) Уровень вложенности (0 - корневой каталог)
  95. ;       $iFull - (0,1,2,3)
  96. ;                  |0 - Относительный
  97. ;                  |1 - Полный путь
  98. ;                  |2 - Имена файлов с расширением
  99. ;                  |3 - Имена файлов без расширения
  100. ;       $iArray - (0,1,2) Определяет вывод результата, массив или список
  101. ;                  |0 - Список с разделителем @CRLF
  102. ;                  |1 - Массив, в котором $iArray[0]=количество файлов (по умолчанию)
  103. ;                  |2 - Массив, в котором $iArray[0] содержит первый файл
  104. ;       $iTypeMask - (0,1,2) Определяет формат записи маски
  105. ;                  |0 - Автоопределение
  106. ;                  |1 - Принудительно маска вида *.is?|s*.cp* (то есть можно указать имя файла без символов * или ? и без расширения и будет найдено)
  107. ;                  |2 - Принудительно маска вида tmp|bak|gid (по расширению, то есть только имена файлов с указанным расширением)
  108. ;       $sLocale - Учитывать регистр букв при поиске.
  109. ;                  |-1 - Не учитывать регистр только для латинских букв
  110. ;                  |0 - Не учитывать регистр, по умолчанию (для всех символов).
  111. ;                  |1 - Учитывать регистр (для всех символов).
  112. ;                  |<символы> - не учитывать регистр указанного диапазона символов локального языка, включая латинские, например 'А-яЁё'. Латинские указывать не требуется, они по умолчанию включены.
  113. ;       $vExcludeFolders - Исключает папки из поиска. Перечислять имена папок через "|", например "имя1|имя2|имя3".
  114. ;       $iExcludeDepth - Уровень вложенности, до которого работает исключение, указанное в параметре $vExcludeFolders. По умолчанию -1, что означает отключено.
  115. ; Возвращаемое значение: Успешно - Массив или список с разделителем @CRLF
  116. ;                   Неудачно - пустая строка, @error:
  117. ;                  |0 - Нет ошибок
  118. ;                  |1 - Неверный путь
  119. ;                  |2 - Неверная маска
  120. ;                  |3 - Ничего не найдено
  121. ; Автор ..........: AZJIO
  122. ; Примечания ..: Используйте функцию _CorrectMask, если маска считывается из поля ввода и требуется проверка на корректность
  123. ; ============================================================================================
  124. ; функция проверки и подготовки входных параметров и обработка результирующего списка
  125. Func _FO_FileSearch($sPath, $sMask = '*', $fInclude = True, $iDepth = 125, $iFull = 1, $iArray = 1, $iTypeMask = 1, $sLocale = 0, $vExcludeFolders = '', $iExcludeDepth = -1)
  126.     Local $vFileList
  127.     If $sMask = '|' Then Return SetError(2, 0, '')
  128.     ; If Not StringRegExp($sPath, '(?i)^[a-z]:[^/:*?"<>|]*$') Or StringInStr($sPath, '\\') Then Return SetError(1, 0, '')
  129.     If Not FileExists($sPath) Then Return SetError(1, 0, '')
  130.     If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
  131.  
  132.     If $vExcludeFolders Then
  133.         $vExcludeFolders = StringSplit($vExcludeFolders, '|')
  134.     Else
  135.         Dim $vExcludeFolders[1] = [0]
  136.     EndIf
  137.  
  138.     If $sMask = '*' Or $sMask = '' Then
  139.         __FO_FileSearchAll($vFileList, $sPath, $iDepth, $vExcludeFolders, $iExcludeDepth)
  140.     Else
  141.         Switch $iTypeMask
  142.             Case 0
  143.                 If StringInStr($sMask, '*') Or StringInStr($sMask, '?') Or StringInStr($sMask, '.') Then
  144.                     __FO_GetListMask($sPath, $sMask, $fInclude, $iDepth, $vFileList, $sLocale, $vExcludeFolders, $iExcludeDepth)
  145.                 Else
  146.                     __FO_FileSearchType($vFileList, $sPath, '|' & $sMask & '|', $fInclude, $iDepth, $vExcludeFolders, $iExcludeDepth)
  147.                 EndIf
  148.             Case 1
  149.                 __FO_GetListMask($sPath, $sMask, $fInclude, $iDepth, $vFileList, $sLocale, $vExcludeFolders, $iExcludeDepth)
  150.             Case Else
  151.                 If StringInStr($sMask, '*') Or StringInStr($sMask, '?') Or StringInStr($sMask, '.') Then Return SetError(2, 0, '')
  152.                 __FO_FileSearchType($vFileList, $sPath, '|' & $sMask & '|', $fInclude, $iDepth, $vExcludeFolders, $iExcludeDepth)
  153.         EndSwitch
  154.     EndIf
  155.  
  156.     If Not $vFileList Then Return SetError(3, 0, '')
  157.     Switch $iFull
  158.         Case 0
  159.             $vFileList = StringRegExpReplace($vFileList, '(?m)^[^\v]{' & StringLen($sPath) & '}', '')
  160.         Case 2
  161.             $vFileList = StringRegExpReplace($vFileList, '(?m)^.*\\', '')
  162.         Case 3
  163.             $vFileList = StringRegExpReplace($vFileList, '(?m)^[^\v]+\\', '')
  164.             $vFileList = StringRegExpReplace($vFileList, '(?m)\.[^./:*?"<>|\\\v]+\r?$', @CR)
  165.     EndSwitch
  166.     $vFileList = StringTrimRight($vFileList, 2)
  167.     Switch $iArray
  168.         Case 1
  169.             $vFileList = StringSplit($vFileList, @CRLF, 1)
  170.             ; If @error And $vFileList[1] = '' Then Dim $vFileList[1] = [0]
  171.         Case 2
  172.             $vFileList = StringSplit($vFileList, @CRLF, 3)
  173.             ; If @error And $vFileList[0]='' Then SetError(3, 0, '')
  174.     EndSwitch
  175.     Return $vFileList
  176. EndFunc   ;==>_FO_FileSearch
  177.  
  178. ; Получение списка и обработка регулярным выражением
  179. Func __FO_GetListMask($sPath, $sMask, $fInclude, $iDepth, ByRef $sFileList, $sLocale, ByRef $aExcludeFolders, ByRef $iExcludeDepth)
  180.     Local $aFileList, $rgex
  181.     __FO_FileSearchMask($sFileList, $sPath, $iDepth, $aExcludeFolders, $iExcludeDepth)
  182.     $sFileList = StringTrimRight($sFileList, 2)
  183.     $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][$^.{}()+]', '\\$0'), '?', '.'), '*', '.*?')
  184.  
  185.     Switch $sLocale
  186.         Case -1 ;  не учитывать регистр только для латинских букв
  187.             $rgex = 'i'
  188.         Case 1 ; как есть '', учитывать регистр
  189.         Case 0 ;  не учитывать регистр, по умолчанию.
  190.             $sLocale = '\x{80}-\x{ffff}'
  191.             ContinueCase
  192.         Case Else ; Иначе указан диапазон или набор символов
  193.             $rgex = 'i'
  194.             $sMask = __FO_UserLocale($sMask, $sLocale)
  195.     EndSwitch
  196.  
  197.     If $fInclude Then
  198.         $aFileList = StringRegExp($sFileList, '(?m' & $rgex & ')^([^|]+\|(?:' & $sMask & '))(?:\r|\z)', 3)
  199.         $sFileList = ''
  200.         For $i = 0 To UBound($aFileList) - 1
  201.             $sFileList &= $aFileList[$i] & @CRLF
  202.         Next
  203.     Else
  204.         $sFileList = StringRegExpReplace($sFileList & @CRLF, '(?m' & $rgex & ')^[^|]+\|(' & $sMask & ')\r\n', '')
  205.     EndIf
  206.     $sFileList = StringReplace($sFileList, '|', '')
  207. EndFunc   ;==>__FO_GetListMask
  208.  
  209. Func __FO_UserLocale($sMask, $sLocale)
  210.     Local $s, $tmp
  211.     $sLocale = StringRegExpReplace($sMask, '[^' & $sLocale & ']', '')
  212.     $tmp = StringLen($sLocale)
  213.     For $i = 1 To $tmp
  214.         $s = StringMid($sLocale, $i, 1)
  215.         If $s Then
  216.             If StringInStr($sLocale, $s, 0, 2, $i) Then
  217.                 $sLocale = $s & StringReplace($sLocale, $s, '')
  218.             EndIf
  219.         Else
  220.             ExitLoop
  221.         EndIf
  222.     Next
  223.     If $sLocale Then
  224.         Local $Upper, $Lower
  225.         $tmp = StringSplit($sLocale, '')
  226.         For $i = 1 To $tmp[0]
  227.             $Upper = StringUpper($tmp[$i])
  228.             $Lower = StringLower($tmp[$i])
  229.             If Not ($Upper == $Lower) Then $sMask = StringReplace($sMask, $tmp[$i], '[' & $Upper & $Lower & ']')
  230.         Next
  231.     EndIf
  232.     Return $sMask
  233. EndFunc   ;==>__FO_UserLocale
  234.  
  235. ; поиск указанных типов файлов
  236. Func __FO_FileSearchType(ByRef $sFileList, $sPath, $sMask, ByRef $fInclude, ByRef $iDepth, ByRef $aExcludeFolders, ByRef $iExcludeDepth, $iCurD = 0)
  237.     Local $iPos, $sFile, $s = FileFindFirstFile($sPath & '*')
  238.     If $s = -1 Then Return
  239.     While 1
  240.         $sFile = FileFindNextFile($s)
  241.         If @error Then ExitLoop
  242.         If @extended Then
  243.             If $iCurD >= $iDepth Or ($iCurD <= $iExcludeDepth And __ChExcludeFolders($sFile, $aExcludeFolders)) Then ContinueLoop
  244.             __FO_FileSearchType($sFileList, $sPath & $sFile & '\', $sMask, $fInclude, $iDepth, $aExcludeFolders, $iExcludeDepth, $iCurD + 1)
  245.         Else
  246.             $iPos = StringInStr($sFile, ".", 0, -1)
  247.             If $iPos And StringInStr($sMask, '|' & StringTrimLeft($sFile, $iPos) & '|') = $fInclude Then
  248.                 $sFileList &= $sPath & $sFile & @CRLF
  249.             ElseIf Not $iPos And Not $fInclude Then
  250.                 $sFileList &= $sPath & $sFile & @CRLF
  251.             EndIf
  252.         EndIf
  253.     WEnd
  254.     FileClose($s)
  255. EndFunc   ;==>__FO_FileSearchType
  256.  
  257. ; поиск файлов по маске
  258. Func __FO_FileSearchMask(ByRef $sFileList, $sPath, ByRef $iDepth, ByRef $aExcludeFolders, ByRef $iExcludeDepth, $iCurD = 0)
  259.     Local $sFile, $s = FileFindFirstFile($sPath & '*')
  260.     If $s = -1 Then Return
  261.     While 1
  262.         $sFile = FileFindNextFile($s)
  263.         If @error Then ExitLoop
  264.         If @extended Then
  265.             If $iCurD >= $iDepth Or ($iCurD <= $iExcludeDepth And __ChExcludeFolders($sFile, $aExcludeFolders)) Then ContinueLoop
  266.             __FO_FileSearchMask($sFileList, $sPath & $sFile & '\', $iDepth, $aExcludeFolders, $iExcludeDepth, $iCurD + 1)
  267.         Else
  268.             $sFileList &= $sPath & '|' & $sFile & @CRLF
  269.         EndIf
  270.     WEnd
  271.     FileClose($s)
  272. EndFunc   ;==>__FO_FileSearchMask
  273.  
  274. ; поиск всех файлов
  275. Func __FO_FileSearchAll(ByRef $sFileList, $sPath, ByRef $iDepth, ByRef $aExcludeFolders, ByRef $iExcludeDepth, $iCurD = 0)
  276.     Local $sFile, $s = FileFindFirstFile($sPath & '*')
  277.     If $s = -1 Then Return
  278.     While 1
  279.         $sFile = FileFindNextFile($s)
  280.         If @error Then ExitLoop
  281.         If @extended Then
  282.             If $iCurD >= $iDepth Or ($iCurD <= $iExcludeDepth And __ChExcludeFolders($sFile, $aExcludeFolders)) Then ContinueLoop
  283.             __FO_FileSearchAll($sFileList, $sPath & $sFile & '\', $iDepth, $aExcludeFolders, $iExcludeDepth, $iCurD + 1)
  284.         Else
  285.             $sFileList &= $sPath & $sFile & @CRLF
  286.         EndIf
  287.     WEnd
  288.     FileClose($s)
  289. EndFunc   ;==>__FO_FileSearchAll
  290.  
  291. Func __ChExcludeFolders(ByRef $sFile, ByRef $aExcludeFolders)
  292.     For $i = 1 To $aExcludeFolders[0]
  293.         If $sFile = $aExcludeFolders[$i] Then Return True
  294.     Next
  295.     Return False
  296. EndFunc   ;==>__ChExcludeFolders
  297.  
  298. ; #FUNCTION# ;=================================================================================
  299. ; Function Name ...: _FO_CorrectMask (__FO_MaskUnique)
  300. ; AutoIt Version ....: 3.3.0.0+
  301. ; Description ........: Corrects a mask
  302. ; Syntax................: _CorrectMask ( $sMask )
  303. ; Parameters........: $sMask - except symbol possible in names are allowed symbols of the substitution "*" and "?" and separator "|"
  304. ; Return values:
  305. ;                   |Success -  Returns a string of a correct mask
  306. ;                   |Failure - Returns a symbol "|" and @error=2
  307. ; Author(s) ..........: AZJIO
  308. ; Remarks ..........: Function corrects possible errors entered by the user
  309. ; ============================================================================================
  310. ; Имя функции ...: _FO_CorrectMask (__FO_MaskUnique)
  311. ; Версия AutoIt ..: 3.3.0.0+
  312. ; Описание ........: Корректировка маски
  313. ; Синтаксис.......: _CorrectMask ( $sMask )
  314. ; Параметры.....: $sMask - кроме символов допустимых в именах допускаются символы подстановки "*" и "?" и разделитель "|"
  315. ; Возвращаемое значение:
  316. ;                   |Успешно -  Возвращает строку корректной маски
  317. ;                   |Неудачно - Возвращает символ "|" и @error=2
  318. ; Автор ..........: AZJIO
  319. ; Примечания ..: Функция исправляет возможные ошибки ввода пользователем:
  320. ; удаляет пробелы и точки на конце каждого элемента маски, удаляет повторы звёздочки и разделителя.
  321. ; ============================================================================================
  322. ; корректировка маски
  323. Func _FO_CorrectMask($sMask)
  324.     If StringRegExp($sMask, '[\\/:"<>]') Then Return SetError(2, 0, '|')
  325.     If StringInStr($sMask, '**') Then $sMask = StringRegExpReplace($sMask, '\*+', '*')
  326.     If StringRegExp($sMask & '|', '[\s|.]\|') Then $sMask = StringRegExpReplace($sMask & '|', '[\s|.]+\|', '|')
  327.     If StringInStr('|' & $sMask & '|', '|*|') Then Return '*'
  328.     If $sMask = '|' Then Return SetError(2, 0, '|')
  329.     If StringRight($sMask, 1) = '|' Then $sMask = StringTrimRight($sMask, 1)
  330.     If StringLeft($sMask, 1) = '|' Then $sMask = StringTrimLeft($sMask, 1)
  331.     __FO_MaskUnique($sMask)
  332.     Return $sMask
  333. EndFunc   ;==>_FO_CorrectMask
  334.  
  335. ; удаление повторяющихся элементов маски
  336. #Obfuscator_Off
  337. Func __FO_MaskUnique(ByRef $sMask)
  338.     Local $t = StringReplace($sMask, '[', Chr(1)), $a = StringSplit($t, '|'), $k = 0
  339.     Assign('/', '', 1)
  340.     For $i = 1 To $a[0]
  341.         If Not IsDeclared($a[$i] & '/') Then
  342.             $k += 1
  343.             $a[$k] = $a[$i]
  344.             Assign($a[$i] & '/', '', 1)
  345.         EndIf
  346.     Next
  347.     If $k <> $a[0] Then
  348.         $sMask = ''
  349.         For $i = 1 To $k
  350.             $sMask &= $a[$i] & '|'
  351.         Next
  352.         $sMask = StringReplace(StringTrimRight($sMask, 1), Chr(1), '[')
  353.     EndIf
  354. EndFunc   ;==>__FO_MaskUnique
  355. #Obfuscator_On
  356.  
  357. ; #FUNCTION# ;=================================================================================
  358. ; Function Name ...: _FO_FolderSearch (__FO_FolderSearch, __FO_FolderSearchMask)
  359. ; AutoIt Version ....: 3.3.2.0+ , versions below this @extended should be replaced by of StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  360. ; Description ........: Search folders on a mask in the subdirectories.
  361. ; Syntax................: _FO_FolderSearch ( $sPath [, $sMask = '*' [, $fInclude=True [, $iDepth=0 [, $iFull=1 [, $iArray=1 [, $sLocale=0]]]]]] )
  362. ; Parameters:
  363. ;       $sPath - Search path
  364. ;       $sMask - Mask using the characters "*" and "?" with the separator "|"
  365. ;       $fInclude - (True / False) invErt the mask, that is excluded from the search of folders
  366. ;       $iDepth - (0-125) Nesting level (0 - root directory)
  367. ;       $iFull - (0,1)
  368. ;                  |0 - Relative
  369. ;                  |1 - Full path
  370. ;       $iArray - (0,1,2) If the value other than zero, the result is an array (by default ),
  371. ;                  |0 - A list of paths separated by @CRLF
  372. ;                  |1 - Array, where $iArray[0]=number of folders ( by default)
  373. ;                  |2 - Array, where $iArray[0] contains the first folder
  374. ;       $sLocale - Case sensitive.
  375. ;                  |-1 - Not case sensitive (only for 'A-z').
  376. ;                  |0 - Not case sensitive, by default. (for any characters)
  377. ;                  |1 - Case sensitive (for any characters)
  378. ;                  |<symbols> - Not case sensitive, specified range of characters from local languages. For example 'А-яЁё'. 'A-z' is not required, they are enabled by default.
  379. ; Return values ....: Success - Array or a list of paths separated by @CRLF
  380. ;                   Failure - Empty string, @error:
  381. ;                  |0 - No error
  382. ;                  |1 - Invalid path
  383. ;                  |2 - Invalid mask
  384. ;                  |3 - Not found
  385. ; Author(s) ..........: AZJIO
  386. ; Remarks ..........: Use function _CorrectMask if it is required correct mask, which is entered by user
  387. ; ============================================================================================
  388. ; Имя функции ...: _FO_FolderSearch (__FO_FolderSearch, __FO_FolderSearchMask)
  389. ; Версия AutoIt ..: 3.3.2.0+ , в версиях ниже указанной нужно @extended заменить на StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  390. ; Описание ........: Поиск папок по маске в подкаталогах.
  391. ; Синтаксис.......: _FO_FolderSearch ( $sPath [, $sMask = '*' [, $fInclude=True [, $iDepth=0 [, $iFull=1 [, $iArray=1 [, $sLocale=0]]]]]] )
  392. ; Параметры:
  393. ;       $sPath - Путь поиска
  394. ;       $sMask - Маска с использованием символов "*" и "?" с перечислением через "|". По умолчанию все папки.
  395. ;       $fInclude - (True / False) Инвертировать маску, то есть исключить из поиска указанные папки
  396. ;       $iDepth - (0-125) Уровень вложенности (0 - корневой каталог)
  397. ;       $iFull - (0,1)
  398. ;                  |0 - Относительный
  399. ;                  |1 - Полный путь
  400. ;       $iArray - (0,1,2) Определяет вывод результата, массив или список
  401. ;                  |0 - Список с разделителем @CRLF
  402. ;                  |1 - Массив, в котором $iArray[0]=количество папок (по умолчанию)
  403. ;                  |2 - Массив, в котором $iArray[0] содержит первую папку
  404. ;       $sLocale - Учитывать регистр букв при поиске.
  405. ;                  |-1 - Не учитывать регистр только для латинских букв
  406. ;                  |0 - Не учитывать регистр, по умолчанию (для всех символов).
  407. ;                  |1 - Учитывать регистр (для всех символов).
  408. ;                  |<символы> - Не учитывать регистр указанного диапазона символов локального языка, включая латинские, например 'А-яЁё'. Латинские указывать не требуется, они по умолчанию включены.
  409. ; Возвращаемое значение: Успешно - Массив или список с разделителем @CRLF
  410. ;                   Неудачно - Пустая строка, @error:
  411. ;                  |0 - Нет ошибок
  412. ;                  |1 - Неверный путь
  413. ;                  |2 - Неверная маска
  414. ;                  |3 - Ничего не найдено
  415. ; Автор ..........: AZJIO
  416. ; Примечания ..: Используйте функцию _CorrectMask, если маска считывается из поля ввода и требуется проверка на корректность
  417. ; ============================================================================================
  418. ; функция проверки и подготовки входных параметров и обработка результирующего списка
  419. Func _FO_FolderSearch($sPath, $sMask = '*', $fInclude = True, $iDepth = 0, $iFull = 1, $iArray = 1, $sLocale = 0)
  420.     Local $vFolderList, $aFolderList, $rgex
  421.     If $sMask = '|' Then Return SetError(2, 0, '')
  422.     ; If Not StringRegExp($sPath, '(?i)^[a-z]:[^/:*?"<>|]*$') Or StringInStr($sPath, '\\') Then Return SetError(1, 0, '')
  423.     If Not FileExists($sPath) Then Return SetError(1, 0, '')
  424.     If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
  425.  
  426.     If $sMask = '*' Or $sMask = '' Then
  427.         __FO_FolderSearch($vFolderList, $sPath, $iDepth)
  428.         $vFolderList = StringTrimRight($vFolderList, 2)
  429.     Else
  430.         __FO_FolderSearchMask($vFolderList, $sPath, $iDepth)
  431.         $vFolderList = StringTrimRight($vFolderList, 2)
  432.         $sMask = StringReplace(StringReplace(StringRegExpReplace($sMask, '[][$^.{}()+]', '\\$0'), '?', '.'), '*', '.*?')
  433.  
  434.         Switch $sLocale
  435.             Case -1 ;  не учитывать регистр только для латинских букв
  436.                 $rgex = 'i'
  437.             Case 1 ; как есть '', учитывать регистр
  438.             Case 0 ;  не учитывать регистр, по умолчанию.
  439.                 $sLocale = '\x{80}-\x{ffff}'
  440.                 ContinueCase
  441.             Case Else ; Иначе указан диапазон или набор символов
  442.                 $rgex = 'i'
  443.                 $sMask = __FO_UserLocale($sMask, $sLocale)
  444.         EndSwitch
  445.  
  446.         If $fInclude Then
  447.             $aFolderList = StringRegExp($vFolderList, '(?m' & $rgex & ')^(.+\|(?:' & $sMask & '))(?:\r|\z)', 3)
  448.             $vFolderList = ''
  449.             For $i = 0 To UBound($aFolderList) - 1
  450.                 $vFolderList &= $aFolderList[$i] & @CRLF
  451.             Next
  452.         Else
  453.             $vFolderList = StringRegExpReplace($vFolderList & @CRLF, '(?m' & $rgex & ')^.+\|(' & $sMask & ')\r\n', '')
  454.         EndIf
  455.         $vFolderList = StringReplace(StringTrimRight($vFolderList, 2), '|', '')
  456.     EndIf
  457.     If Not $vFolderList Then Return SetError(3, 0, '')
  458.  
  459.     If $iFull = 0 Then $vFolderList = StringRegExpReplace($vFolderList, '(?m)^[^\v]{' & StringLen($sPath) & '}', '')
  460.  
  461.     Switch $iArray
  462.         Case 1
  463.             $vFolderList = StringSplit($vFolderList, @CRLF, 1)
  464.             ; If @error And $vFolderList[1] = '' Then Dim $vFolderList[1] = [0]
  465.         Case 2
  466.             $vFolderList = StringSplit($vFolderList, @CRLF, 3)
  467.             ; If @error And $vFolderList[0]='' Then SetError(3, 0, '')
  468.     EndSwitch
  469.     Return $vFolderList
  470. EndFunc   ;==>_FO_FolderSearch
  471.  
  472. ; поиск папок по маске
  473. Func __FO_FolderSearchMask(ByRef $sFolderList, $sPath, $iDepth, $iCurD = 0)
  474.     Local $sFile, $s = FileFindFirstFile($sPath & '*')
  475.     If $s = -1 Then Return
  476.     While 1
  477.         $sFile = FileFindNextFile($s)
  478.         If @error Then ExitLoop
  479.         If @extended Then
  480.             If $iCurD < $iDepth Then
  481.                 $sFolderList &= $sPath & '|' & $sFile & @CRLF
  482.                 __FO_FolderSearchMask($sFolderList, $sPath & $sFile & '\', $iDepth, $iCurD + 1)
  483.             ElseIf $iCurD = $iDepth Then
  484.                 $sFolderList &= $sPath & '|' & $sFile & @CRLF
  485.             EndIf
  486.         EndIf
  487.     WEnd
  488.     FileClose($s)
  489. EndFunc   ;==>__FO_FolderSearchMask
  490.  
  491. ; поиск всех папок
  492. Func __FO_FolderSearch(ByRef $sFolderList, $sPath, $iDepth, $iCurD = 0)
  493.     Local $sFile, $s = FileFindFirstFile($sPath & '*')
  494.     If $s = -1 Then Return
  495.     While 1
  496.         $sFile = FileFindNextFile($s)
  497.         If @error Then ExitLoop
  498.         If @extended Then
  499.             If $iCurD < $iDepth Then
  500.                 $sFolderList &= $sPath & $sFile & @CRLF
  501.                 __FO_FolderSearch($sFolderList, $sPath & $sFile & '\', $iDepth, $iCurD + 1)
  502.             ElseIf $iCurD = $iDepth Then
  503.                 $sFolderList &= $sPath & $sFile & @CRLF
  504.             EndIf
  505.         EndIf
  506.     WEnd
  507.     FileClose($s)
  508. EndFunc   ;==>__FO_FolderSearch
  509.  
  510. ; #FUNCTION# ;=================================================================================
  511. ; Function Name ...: _FO_SearchEmptyFolders (__FO_SearchEmptyFolders1, __FO_SearchEmptyFolders2)
  512. ; AutoIt Version ....: 3.3.2.0+ , versions below this @extended should be replaced by of StringInStr(FileGetAttrib($sPath&'\'&$sFile), "D")
  513. ; Description ........: Search for empty folders
  514. ; Syntax................: _FO_SearchEmptyFolders ( $sPath [, $iType = 0 [, $iArray = 1 [, $iFull = 1]]] )
  515. ; Parameters:
  516. ;       $sPath - search path
  517. ;       $iType - (0,1) Defines, absolutely empty folders or to allow the catalog with empty folders, without adding nested
  518. ;                  |0 - Folder can contain empty folders without adding them to the list (default)
  519. ;                  |1 - Folders are empty absolutely
  520. ;       $iArray - (0,1,2) if the value other than zero, the result is an array (by default),
  521. ;                  |0 - a list of paths separated by @CRLF
  522. ;                  |1 - array, where $iArray[0]=number of folders (by default)
  523. ;                  |2 - array, where $iArray[0] contains the first folder
  524. ;       $iFull - (0,1) Full or relative path
  525. ;                  |0 - relative path
  526. ;                  |1 - full path (by default)
  527. ; Return values ....: Success - Array ($iArray[0]=number of folders) or a list of paths separated by @CRLF
  528. ;                   Failure - empty string, @error:
  529. ;                  |0 - no error
  530. ;                  |1 - Invalid path
  531. ;                  |2 - not found
  532. ; Author(s) ..........: AZJIO
  533. ; Remarks ..........: The main purpose of the function to delete empty folders in the future
  534. ; ============================================================================================
  535. ; Имя функции ...: _FO_SearchEmptyFolders (__FO_SearchEmptyFolders1, __FO_SearchEmptyFolders2)
  536. ; Версия AutoIt ..: 3.3.2.0+ , в версиях ниже указанной нужно @extended заменить на StringInStr(FileGetAttrib($sPath & $sFile), "D")
  537. ; Описание ........: Поиск пустых папок
  538. ; Синтаксис.......: _FO_SearchEmptyFolders ( $sPath [, $iType = 0 [, $iArray = 1 [, $iFull = 1]]] )
  539. ; Параметры:
  540. ;       $sPath - путь поиска
  541. ;       $iType - (0,1) определяет, совсем пустые папки или разрешить каталог c пустыми папками, не добавляя вложенных
  542. ;                  |0 - папка может содержать пустые папки, не добавляя последние к списку (по умолчанию)
  543. ;                  |1 - папки пусты совсем
  544. ;       $iArray - (0,1,2) определяет вывод результата, массив или список
  545. ;                  |0 - список с разделителем @CRLF
  546. ;                  |1 - массив, в котором $array[0]=количество папок (по умолчанию)
  547. ;                  |2 - массив, в котором $array[0] содержит первую папку
  548. ;       $iFull - (0,1) Полный или относительный путь
  549. ;                  |0 - относительный путь
  550. ;                  |1 - полный путь (по умолчанию)
  551. ; Возвращаемое значение: Успешно - Массив ($array[0]=количество папок) или список с разделителем @CRLF
  552. ;                   Неудачно - пустая строка, @error:
  553. ;                  |0 - нет ошибок
  554. ;                  |1 - неверный путь
  555. ;                  |2 - ничего не найдено
  556. ; Автор ..........: AZJIO
  557. ; Примечания ..: Основная цель функции - последующее удаление пустых папок по найденному списку
  558. ; ============================================================================================
  559. ; поиск пустых папок
  560. Func _FO_SearchEmptyFolders($sPath, $iType = 0, $iArray = 1, $iFull = 1)
  561.     If Not _FO_IsDir($sPath) Then Return SetError(1, 0, '')
  562.     If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
  563.     Local $sFolderList
  564.     If $iType Then
  565.         $sFolderList = __FO_SearchEmptyFolders1($sPath)
  566.     Else
  567.         $sFolderList = __FO_SearchEmptyFolders2($sPath)
  568.     EndIf
  569.     If Not $sFolderList Then Return SetError(2, 0, '')
  570.     ; $sFolderList = StringReplace($sFolderList, '\'&@CR, @CR)
  571.     $sFolderList = StringTrimRight($sFolderList, 2)
  572.     ; If $sFolderList = $sPath Then Return SetError(3, 0, '') ;                  |3 - корневой каталог пуст или содержит пустые каталоги при $iType = 0
  573.     If Not $iFull Then $sFolderList = StringRegExpReplace($sFolderList, '(?m)^(?:.{' & StringLen($sPath) & '})(.*)$', '\1')
  574.     Switch $iArray
  575.         Case 1
  576.             $sFolderList = StringSplit($sFolderList, @CRLF, 1)
  577.         Case 2
  578.             $sFolderList = StringSplit($sFolderList, @CRLF, 3)
  579.     EndSwitch
  580.     Return $sFolderList
  581. EndFunc   ;==>_FO_SearchEmptyFolders
  582.  
  583. Func __FO_SearchEmptyFolders1($sPath)
  584.     Local $sFolderList = '', $sFile, $s = FileFindFirstFile($sPath & '*')
  585.     If $s = -1 Then Return $sPath & @CRLF
  586.     While 1
  587.         $sFile = FileFindNextFile($s)
  588.         If @error Then ExitLoop
  589.         If @extended Then
  590.             $sFolderList &= __FO_SearchEmptyFolders1($sPath & $sFile & '\')
  591.         EndIf
  592.     WEnd
  593.     FileClose($s)
  594.     Return $sFolderList
  595. EndFunc   ;==>__FO_SearchEmptyFolders1
  596.  
  597. Func __FO_SearchEmptyFolders2($sPath)
  598.     Local $iFill = 0, $sFolderList = '', $sFile, $s = FileFindFirstFile($sPath & '*')
  599.     If $s = -1 Then Return $sPath & @CRLF
  600.     While 1
  601.         $sFile = FileFindNextFile($s)
  602.         If @error Then ExitLoop
  603.         If @extended Then
  604.             $sFolderList &= __FO_SearchEmptyFolders2($sPath & $sFile & '\')
  605.             $iFill += @extended
  606.         Else
  607.             $iFill += 1
  608.         EndIf
  609.     WEnd
  610.     FileClose($s)
  611.     If $iFill = 0 Then
  612.         $s = StringRegExpReplace($sPath, '[][$^.{}()+\\]', '\\$0')
  613.         $sFolderList = StringRegExpReplace($sFolderList, '(?mi)^' & $s & '.*?\r\n', '')
  614.         $sFolderList &= $sPath & @CRLF
  615.     EndIf
  616.     Return SetError(0, $iFill, $sFolderList)
  617. EndFunc   ;==>__FO_SearchEmptyFolders2
  618.  
  619. ; #FUNCTION# ;=================================================================================
  620. ; Function Name ...: _FO_FileDirReName
  621. ; Description ........: Renaming a file or directory.
  622. ; Syntax................: _FO_FileDirReName ( $sSource, $sNewName [, $iFlag=0 [, $DelAttrib=0 [, $iDir=-1]]] )
  623. ; Parameters:
  624. ;       $sSource - Full path of the file or directory
  625. ;       $sNewName - New name
  626. ;       $iFlag - (0,1) Flag to overwrite existing
  627. ;                  |0 - do not overwrite existing file/directory
  628. ;                  |1 - overwrite the existing file (if a directory, preliminary removing)
  629. ;       $DelAttrib - (0,1) to remove attributes (-RST), if not let you delete the file/directory
  630. ;                  |0 - do not remove the attributes
  631. ;                  |1 - remove attributes
  632. ;       $iDir - Specifies what is $sSource
  633. ;                  |-1 - Auto-detect
  634. ;                  |0 - file
  635. ;                  |1 - directory
  636. ; Return values ....: Success - 1
  637. ;                   Failure - 0, @error:
  638. ;                  |0 - no error
  639. ;                  |1 - FileMove or DirMove return failure
  640. ;                  |2 - $sNewName - empty string
  641. ;                  |3 - $sSource - file / directory in the specified path does not exist
  642. ;                  |4 - original and the new name are the same
  643. ;                  |5 - $sNewName - contains invalid characters
  644. ; Author(s) ..........: AZJIO
  645. ; Remarks ..........: If a new file / directory with the same name exists, it will be deleted.
  646. ; ============================================================================================
  647. ; Имя функции ...: _FO_FileDirReName
  648. ; Описание ........: Переименовывает файл или каталог.
  649. ; Синтаксис.......: _FO_FileDirReName ( $sSource, $sNewName [, $iFlag=0 [, $DelAttrib=0 [, $iDir=-1]]] )
  650. ; Параметры:
  651. ;       $sSource - Полный путь к каталогу или файлу
  652. ;       $sNewName - Новое имя
  653. ;       $iFlag - (0,1) Флаг перезаписи существующих
  654. ;                  |0 - не перезаписывать существующий файл/каталог
  655. ;                  |1 - перезаписывать существующий файл (если каталог, то предварительное его удаление)
  656. ;       $DelAttrib - (0,1) Снять атрибуты (-RST) непозволяющие удалить файл/каталог
  657. ;                  |0 - не снимать атрибуты
  658. ;                  |1 - снимать атрибуты
  659. ;       $iDir - Указывает чем является $sSource
  660. ;                  |-1 - автоопределение
  661. ;                  |0 - файл
  662. ;                  |1 - каталог
  663. ; Возвращаемое значение: Успешно - 1
  664. ;                   Неудачно - 0, @error:
  665. ;                  |0 - нет ошибок
  666. ;                  |1 - FileMove или DirMove возвратили неудачу
  667. ;                  |2 - $sNewName - пустая строка
  668. ;                  |3 - $sSource - файл/каталог по указанному пути не существует
  669. ;                  |4 - исходное и новое имя совпадают
  670. ;                  |5 - $sNewName - содержит недопустимые символы
  671. ; Автор ..........: AZJIO
  672. ; Примечания ..: Если новый файл/каталог с таким же именем существует, то будет удалён.
  673. ; ============================================================================================
  674. Func _FO_FileDirReName($sSource, $sNewName, $iFlag = 0, $DelAttrib = 0, $iDir = -1)
  675.     Local $i, $n, $sName, $sPath, $sTmpPath
  676.     If Not $sNewName Then Return SetError(2, 0, 0)
  677.     If StringRegExp($sNewName, '[\\/:*?"<>|]') Then Return SetError(5, 0, 0) ; (???) Индикатором служит FileMove/DirMove, но если отключить то FileMove будет поддерживать маски
  678.     If Not FileExists($sSource) Then Return SetError(3, 0, 0)
  679.     $n = StringInStr($sSource, '\', 0, -1)
  680.     $sPath = StringLeft($sSource, $n)
  681.     $sName = StringTrimLeft($sSource, $n)
  682.     If $iDir = -1 Then $iDir = StringInStr(FileGetAttrib($sSource), 'D')
  683.     $n = 0
  684.     If $sName = $sNewName Then
  685.         If $sName == $sNewName Then Return SetError(4, 0, 0)
  686.  
  687.         $i = 0
  688.         Do
  689.             $i += 1
  690.             $sTmpPath = $sPath & '$#@_' & $i & '.tmp'
  691.         Until Not FileExists($sTmpPath)
  692.  
  693.         If $iDir Then
  694.             If DirMove($sSource, $sTmpPath) Then $n = DirMove($sTmpPath, $sPath & $sNewName)
  695.         Else
  696.             If FileMove($sSource, $sTmpPath) Then $n = FileMove($sTmpPath, $sPath & $sNewName)
  697.         EndIf
  698.     Else
  699.         If $iDir Then
  700.             If FileExists($sPath & $sNewName) Then
  701.                 If $iFlag Then
  702.                     If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
  703.                     If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
  704.                         If DirRemove($sPath & $sNewName, 1) Then $n = DirMove($sSource, $sPath & $sNewName)
  705.                     Else
  706.                         If FileDelete($sPath & $sNewName) Then $n = DirMove($sSource, $sPath & $sNewName)
  707.                     EndIf
  708.                 EndIf
  709.             Else
  710.                 $n = DirMove($sSource, $sPath & $sNewName)
  711.             EndIf
  712.         Else
  713.             If FileExists($sPath & $sNewName) Then
  714.                 If $iFlag Then
  715.                     If $DelAttrib Then FileSetAttrib($sPath & $sNewName, "-RST", 1)
  716.                     If StringInStr(FileGetAttrib($sPath & $sNewName), 'D') Then
  717.                         If DirRemove($sPath & $sNewName, 1) Then $n = FileMove($sSource, $sPath & $sNewName)
  718.                     Else
  719.                         $n = FileMove($sSource, $sPath & $sNewName, $iFlag)
  720.                     EndIf
  721.                 EndIf
  722.             Else
  723.                 $n = FileMove($sSource, $sPath & $sNewName)
  724.             EndIf
  725.         EndIf
  726.     EndIf
  727.     SetError(Not $n, 0, $n)
  728. EndFunc   ;==>_FO_FileDirReName
  729.  
  730. ; #FUNCTION# ;=================================================================================
  731. ; Function Name ...: _FO_GetCopyName
  732. ; Description ........: Returns the name of a nonexistent copy of the file
  733. ; Syntax................: _FO_GetCopyName ( $sPath [, $iMode=0 [, $sText='Copy']] )
  734. ; Parameters:
  735. ;       $sPath - Full path of the file or directory
  736. ;       $iMode - (0,1) Select the index assignment
  737. ;                  |0 - Standard, is similar to creating a copy of a file in Win7
  738. ;                  |1 - Append index _1, _2, etc.
  739. ;       $sText - Text "Copy"
  740. ; Return values ....: The path to the file copy
  741. ; Author(s) ..........: AZJIO
  742. ; Remarks ..........: There is no error, the function returns the primary name or a new name correctly.
  743. ; ============================================================================================
  744. ; Имя функции ...: _FO_GetCopyName
  745. ; Описание ........: Возвращает имя несуществующей копии файла.
  746. ; Синтаксис.......: _FO_GetCopyName ( $sPath [, $iMode=0 [, $sText='Copy']] )
  747. ; Параметры:
  748. ;       $sPath - Полный путь к каталогу или файлу
  749. ;       $iMode - (0,1) Выбор варианта присваивания индекса
  750. ;                  |0 - Стандартное, аналогично созданию копии файла в Win7
  751. ;                  |1 - Дописывать индекс копии _1, _2 и т.д.
  752. ;       $sText - Текст "Копия", может быть изменён взависимости от локализации
  753. ; Возвращаемое значение: Путь копии файла
  754. ; Автор ..........: AZJIO
  755. ; Примечания ..: Функция не возвращает ошибки, так как возвращает либо переданную ей строку (если файл не существует), либо новое корректное имя.
  756. ; ============================================================================================
  757. Func _FO_GetCopyName($sPath, $iMode = 0, $sText = 'Copy') ; Копия, префикс взависимости от локализации
  758.     Local $i, $aPath[3]
  759.     If FileExists($sPath) Then
  760.         $aPath = _FO_PathSplit($sPath)
  761.         ; цикл проверки одноимённых файлов
  762.         $i = 0
  763.         If $iMode Then
  764.             Do
  765.                 $i += 1
  766.                 $sPath = $aPath[0] & $aPath[1] & '_' & $i & $aPath[2]
  767.             Until Not FileExists($sPath)
  768.         Else
  769.             Do
  770.                 $i += 1
  771.                 If $i = 1 Then
  772.                     $sPath = $aPath[0] & $aPath[1] & ' ' & $sText & $aPath[2]
  773.                 Else
  774.                     $sPath = $aPath[0] & $aPath[1] & ' ' & $sText & ' (' & $i & ')' & $aPath[2]
  775.                 EndIf
  776.             Until Not FileExists($sPath)
  777.         EndIf
  778.     EndIf
  779.     Return $sPath
  780. EndFunc   ;==>_FO_GetCopyName
  781.  
  782. ; #FUNCTION# ;=================================================================================
  783. ; Function Name ...: _FO_FileBackup
  784. ; Description ........: Creates a backup file.
  785. ; Syntax.......: _FO_FileBackup ( $sPathOriginal [, $sPathBackup='' [, $iCountCopies=3 [, $iDiffSize=0 [, $iDiffTime=0]]]] )
  786. ; Parameters:
  787. ;       $sPathOriginal - The full path to the original file
  788. ;       $sPathBackup - Full or relative path to the backup. The default is "" - empty string, i.e. the current directory
  789. ;       $iCountCopies - The maximum number of copies from 1 or more. By default, 3 copies.
  790. ;       $iDiffSize - Consider changing the size.
  791. ;                  |-1 - Forced to make a reservation
  792. ;                  |0 - do not take into consideration the size (by default). In this case, indicate the criterion by date
  793. ;                  |1 - to execute reservation if files of the original and a copy are various
  794. ;       $iDiffTime - The time interval in seconds between changes in the original and last copies of the file. The default is 0 - do not check.
  795. ; Return values: Success - 1, Specifies that the backup performed
  796. ;                   Failure - 0, @error:
  797. ;                  |0 - There is no error, but the backup may fail, with the lack of criteria for reservation
  798. ;                  |1 - failed to make a reservation, failure FileCopy or FileMove
  799. ;                  |2 - number of copies less than 1
  800. ;                  |3 - missing file for backup
  801. ; Author(s) ..........: AZJIO
  802. ; Remarks ..: The function creates a backup, and the oldest copy is removed. When disabled the criteria (the default) only one copy is created and is not updated in the future.
  803. ; ============================================================================================
  804. ; Имя функции ...: _FO_FileBackup
  805. ; Описание ........: Создаёт резервную копию файла.
  806. ; Синтаксис.......: _FO_FileBackup ( $sPathOriginal [, $sPathBackup='' [, $iCountCopies=3 [, $iDiffSize=0 [, $iDiffTime=0]]]] )
  807. ; Параметры:
  808. ;       $sPathOriginal - Полный путь к оригинальному файлу
  809. ;       $sPathBackup - Полный или относительный путь к каталогу резервирования. По умолчанию "" - пустая строка, т.е текущая папка
  810. ;       $iCountCopies - Максимальное количество копий, от 1 и более. По умолчанию 3 копии.
  811. ;       $iDiffSize - (-1, 0, 1) Учитывать изменение размера. Если 1, то копия не создаётся если оригинал не изменился в размере
  812. ;                  |-1 - принудительно сделать резервирование
  813. ;                  |0 - не учитывать размер (по умолчанию). В этом случае указать критерий по дате
  814. ;                  |1 - резервирование выполняется при различии размеров файлов оригинала и последней созданной копии
  815. ;       $iDiffTime - Интервал времени в секундах между изменениями оригинала и последней копии файла. По умолчанию 0 - не проверять.
  816. ; Возвращаемое значение: Успешно - 1, указывает что резервирование выполнено
  817. ;                   Неудачно - 0, @error:
  818. ;                  |0 - нет ошибок, но резервирование может не выполнится, при отсутсвии критериев резервирования
  819. ;                  |1 - не удалось сделать резервирование, неудача FileMove или FileCopy
  820. ;                  |2 - количество копий менее 1
  821. ;                  |3 - отсутствует файл для резервирования
  822. ; Автор ..........: AZJIO
  823. ; Примечания ..: Функция создаёт очередную резервную копию, при этом самая старая копия удаляется. При отключенных критериях (по умолчанию) создаётся только одна копия и не обновляется в дальнейшем.
  824. ; ============================================================================================
  825. Func _FO_FileBackup($sPathOriginal, $sPathBackup = '', $iCountCopies = 3, $iDiffSize = 0, $iDiffTime = 0)
  826.     Local $aPath, $aTB, $aTO, $iDateCalc, $Success
  827.     If $iCountCopies < 1 Then Return SetError(2, 0, 0)
  828.     If Not FileExists($sPathOriginal) Then Return SetError(3, 0, 0)
  829.     $aPath = _FO_PathSplit($sPathOriginal)
  830.     If Not $sPathBackup Then
  831.         $sPathBackup = $aPath[0] ; если пустая строка
  832.     ElseIf Not (StringRegExp($sPathBackup, '(?i)^[a-z]:[^/:*?"<>|]*$') Or StringInStr($sPathBackup, '\\')) Then ; если не полный путь или не UNC
  833.         If StringRegExp($sPathBackup, '[/:*?"<>|]') Then
  834.             $sPathBackup = $aPath[0]
  835.         Else
  836.             $sPathBackup = StringReplace($aPath[0] & $sPathBackup & '\', '\\', '\') ; то относительный путь
  837.         EndIf
  838.     EndIf
  839.     Switch $iDiffSize
  840.         Case -1
  841.             $iDiffSize = 1
  842.         Case 0
  843.             $iDiffSize = 0
  844.         Case Else
  845.             $iDiffSize = (FileGetSize($sPathOriginal) <> FileGetSize($sPathBackup & $aPath[1] & '_1' & $aPath[2]))
  846.     EndSwitch
  847.     If $iDiffTime Then
  848.         $aTO = FileGetTime($sPathOriginal)
  849.         $aTB = FileGetTime($sPathBackup & $aPath[1] & '_1' & $aPath[2])
  850.         If Not @error Then
  851.             $iDateCalc = _DateDiff('s', $aTB[0] & '/' & $aTB[1] & '/' & $aTB[2] & ' ' & $aTB[3] & ':' & $aTB[4] & ':' & $aTB[5], $aTO[0] & '/' & $aTO[1] & '/' & $aTO[2] & ' ' & $aTO[3] & ':' & $aTO[4] & ':' & $aTO[5])
  852.             $iDiffTime = ($iDateCalc > $iDiffTime)
  853.         EndIf
  854.     EndIf
  855.     $sPathBackup &= $aPath[1]
  856.     If Not FileExists($sPathBackup & '_1' & $aPath[2]) Or $iDiffSize Or $iDiffTime Then
  857.         $Success = 1
  858.         For $i = $iCountCopies To 2 Step -1
  859.             If $Success And FileExists($sPathBackup & '_' & $i - 1 & $aPath[2]) Then $Success = FileMove($sPathBackup & '_' & $i - 1 & $aPath[2], $sPathBackup & '_' & $i & $aPath[2], 9)
  860.         Next
  861.         If $Success Then $Success = FileCopy($sPathOriginal, $sPathBackup & '_1' & $aPath[2], 9)
  862.         Return SetError(Not $Success, 0, $Success)
  863.     EndIf
  864.     Return SetError(0, 0, 0)
  865. EndFunc   ;==>_FO_FileBackup
  866.  
  867. ; #FUNCTION# ;=================================================================================
  868. ; Function Name ...: _FO_PathSplit
  869. ; Description ........: Divides the path into 3 parts : path, file, and extension.
  870. ; Syntax.......: _FO_PathSplit ( $sPath )
  871. ; Parameters:
  872. ;       $sPath - Path
  873. ; Return values: Success - array in the following format
  874. ;       $Array[0] = path
  875. ;       $Array[1] = name of the file / directory
  876. ;       $Array[2] = extension
  877. ; Author(s) ..........: AZJIO
  878. ; Remarks ..: Function has no errors. If you do not have any portion of a path, the array contains an empty cell for this item
  879. ; ============================================================================================
  880. ; Имя функции ...: _FO_PathSplit
  881. ; Описание ........: Делит путь на 3 части: путь, файл, расширение.
  882. ; Синтаксис.......: _FO_PathSplit ( $sPath )
  883. ; Параметры:
  884. ;       $sPath - Путь
  885. ; Возвращаемое значение: Успешно - массив из 3-x элементов следующего формата
  886. ;       $Array[0] = путь
  887. ;       $Array[1] = имя файла / каталога
  888. ;       $Array[2] = расширение
  889. ; Автор ..........: AZJIO
  890. ; Примечания ..: Функция не имеет ошибок. Если отсутствует какой либо элемент пути, то массив содержит пустую ячейку для этого элемента
  891. ; ============================================================================================
  892. Func _FO_PathSplit($sPath)
  893.     Local $i, $aPath[3] ; ( Dir | Name | Ext )
  894.     $i = StringInStr($sPath, '\', 0, -1)
  895.     $aPath[1] = StringTrimLeft($sPath, $i)
  896.     $aPath[0] = StringLeft($sPath, $i) ; Dir
  897.     $i = StringInStr($aPath[1], '.', 1, -1)
  898.     If $i Then
  899.         $i -= 1
  900.         $aPath[2] = StringTrimLeft($aPath[1], $i) ; Ext
  901.         $aPath[1] = StringLeft($aPath[1], $i) ; Name
  902.     EndIf
  903.     Return $aPath
  904. EndFunc   ;==>_FO_PathSplit
  905.  
  906. Func _FO_IsDir($sTmp)
  907.     $sTmp = FileGetAttrib($sTmp)
  908.     Return SetError(@error, 0, StringInStr($sTmp, 'D', 2) > 0)
  909. EndFunc   ;==>_FO_IsDir
  910.  
  911. ; #FUNCTION# ;=================================================================================
  912. ; Function Name ...: _FO_ShortFileSize
  913. ; Description ........: The file size in bytes converts into short to 3 significant figures
  914. ; Syntax................: _FO_ShortFileSize($iBytes)
  915. ; Parameters:
  916. ;       $iBytes - Bytes
  917. ; Return values ....: A string containing the number
  918. ; Author(s) ..........: AZJIO
  919. ; Remarks ..........:
  920. ; ============================================================================================
  921. ; Имя функции ...: _FO_ShortFileSize
  922. ; Описание ........: Преобразует байты в число, округлённое до 3 знаков
  923. ; Синтаксис.......: _FO_ShortFileSize($iBytes)
  924. ; Параметры:
  925. ;       $iBytes - Число байт
  926. ; Возвращаемое значение: Строка, содержащая число с приставкой
  927. ; Автор ..........: AZJIO
  928. ; Примечания ..:
  929. ; ============================================================================================
  930. Func _FO_ShortFileSize($iBytes)
  931.     Switch $iBytes
  932.         Case 10995116277760 To 109951162777600 ; 10 - 100 TB
  933.             $iBytes = Round($iBytes / 1099511627776, 1) & ' TB'
  934.         Case 1000000000000 To 10995116277759 ; 1000 GB - 10 TB
  935.             $iBytes = Round($iBytes / 1099511627776, 2) & ' TB'
  936.         Case 107374182400 To 999999999999 ; 100 - 999 GB
  937.             $iBytes = Round($iBytes / 1073741824) & ' GB'
  938.         Case 10737418240 To 107374182399 ; 10 - 100 GB
  939.             $iBytes = Round($iBytes / 1073741824, 1) & ' GB'
  940.         Case 1000000000 To 10737418239 ; 1000 MB - 10 GB
  941.             $iBytes = Round($iBytes / 1073741824, 2) & ' GB'
  942.         Case 104857600 To 999999999 ; 100 - 999 MB
  943.             $iBytes = Round($iBytes / 1048576) & ' MB'
  944.         Case 10485760 To 104857599 ; 10 - 100 MB
  945.             $iBytes = Round($iBytes / 1048576, 1) & ' MB'
  946.         Case 1000000 To 10485759 ; 1000 KB - 10 MB
  947.             $iBytes = Round($iBytes / 1048576, 2) & ' MB'
  948.         Case 102400 To 999999 ; 100 - 999 KB
  949.             $iBytes = Round($iBytes / 1024) & ' KB'
  950.         Case 10240 To 102399 ; 10 - 100 KB
  951.             $iBytes = Round($iBytes / 1024, 1) & ' KB'
  952.         Case 1000 To 10239 ; 1000 B - 10 KB
  953.             $iBytes = Round($iBytes / 1024, 2) & ' KB'
  954.         Case 0 To 999
  955.             $iBytes &= ' B'
  956.     EndSwitch
  957.     Return $iBytes
  958. EndFunc   ;==>_FO_ShortFileSize
  959.  
  960. ; #FUNCTION# ;=================================================================================
  961. ; Function Name ...: _FO_IsEmptyFolder
  962. ; Description ........: Checks whether the folder is empty
  963. ; Syntax................: _FO_IsEmptyFolder($sPath)
  964. ; Parameters:
  965. ;       $sPath - The path to the folder
  966. ; Return values ....: Success
  967. ;                   |1 - the folder is empty
  968. ;                   |0 - folder is not empty or error.
  969. ;                   Failure - If @error is set to 1, the folder does not exist or access denied.
  970. ; Author(s) ..........: AZJIO
  971. ; Remarks ..........:
  972. ; ============================================================================================
  973. ; Имя функции ...: _FO_IsEmptyFolder
  974. ; Описание ........: Проверяет, является ли папка пустой
  975. ; Синтаксис.......: _FO_IsEmptyFolder($sPath)
  976. ; Параметры:
  977. ;       $sPath - Путь к папке
  978. ; Возвращаемое значение: Успешно
  979. ;                   |1 - папка пуста
  980. ;                   |0 - папка не пуста или ошибка.
  981. ;                   Неудачно - Если @error равен 1, то папка не существует или нет доступа.
  982. ; Автор ..........: AZJIO
  983. ; Примечания ..:
  984. ; ============================================================================================
  985. Func _FO_IsEmptyFolder($sPath)
  986.     If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
  987.     Local $s = FileFindFirstFile($sPath & '*')
  988.     If $s = -1 Then
  989.         If @error Then Return 1
  990.         Return SetError(1, 0, 0)
  991.     Else
  992.         FileClose($s)
  993.         Return 0
  994.     EndIf
  995. EndFunc   ;==>_FO_IsEmptyFolder
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement