SHARE
TWEET

FileOperations.au3

AZJIO Sep 16th, 2011 1,199 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top