VelDmi
Цитата:
Уфф, мне не дано такое понять...
|
Время покажет, я так тоже раньше думал, если бы мне, где то пол года назад показали подобный код, я бы точно также отреагировал
Вот превратил всё это дело в функцию, теперь проверил работоспособность, вроде работает
Переменная $ExcludeList также может иметь сразу список файлов для исключения, вот пример -
$ExcludeList = "C:\CutDir\test.txt|C:\CutDir\test2.txt" - файлы C:\CutDir\test.txt и C:\CutDir\test2.txt не будут тронуты функцией. Также можно передать во второй параметр функции
_DeleteFilesWithExcludes() массив содержащий список файлов для исключения, ну и как показанно в примере, поддерживается и обычный путь к файлу, с которого будет браться список исключении.
При успешной операции, возвращает
@extended, макрос будет содержать число файлов которые были удалены (именно удалены, не просто количество файлов в соответствии со списком исключении).
Код:

#include <Array.au3>
#include <File.au3>
$Dir = @ScriptDir & "\CutDir"
;Эта переменная может быть массивом, полным списком файлов исключении (разделённый через |),
;а так-же это можт быть путь к файлу содержащий список файлов которые будут исключены при удалении.
$ExcludeList = @ScriptDir & "\file.txt" ;Пример переменной - "c:\CutDir\test.txt|c:\CutDir\test2.txt" ... и т.д
_DeleteFilesWithExcludes($Dir, $ExcludeList)
If Not @error Then MsgBox(262144+64, "Finish", "Было удалено <" & @extended & "> файлов")
;Функция для удаления файлов из всех подкаталогов заданного каталога, в соответствии со списком исключении.
Func _DeleteFilesWithExcludes($sPath, $ExcludeList)
Local $ExcludeListArr[1], $Extended = 0
;Если не существует каталога (в котором следует производить удаление) или переменная $sPath не является каталогом,
;возвращаем ошибку №1.
If Not StringInStr(FileGetAttrib($sPath), "D") Then Return SetError(1, 0, 0)
;Получаем массив структуры каталогов в папке "CutDir" (из переменной $Dir)
Local $DirsArray = _DirListToArray($sPath)
If Not IsArray($ExcludeList) And FileExists($ExcludeList) Then
;Получаем массив со списком файлов которые не нужно удалять (из файл от переменной $ExcludeList)..
_FileReadToArray($ExcludeList, $ExcludeListArr)
ElseIf IsString($ExcludeList) And StringInStr($ExcludeList, "|") Then
;Превращаем переменную в массив (разделяя этим символом |)
$ExcludeListArr = StringSplit($ExcludeList, "|")
ElseIf IsArray($ExcludeList) Then
;Присваиваем внутреннему массиву (ранее созданному) то же значение что и у массива $ExcludeList
$ExcludeListArr = $ExcludeList
Else
;Не предвиденная ошибка, передана пустая переменная или неверный формат массива/переменной - возвращаем ошибку №2.
Return SetError(2, 0, 0)
EndIf
;Получаем массив со списком файлов корневого каталога ($sPath)...
$RootFilesArr = _FileListToArray($sPath, "*.*", 1)
If IsArray($RootFilesArr) Then
For $iR = 1 To UBound($RootFilesArr)-1
;Поиск элемента (текущего файла включая полный путь)...
$SearchInArr = _ArraySearch($ExcludeListArr, $sPath & "\" & $RootFilesArr[$iR])
;Если не найден, то удаляем файл...
If $SearchInArr = -1 Then $Extended += FileDelete($sPath & "\" & $RootFilesArr[$iR])
Next
EndIf
;Проходим по массиву структуры каталогов, получаем массив со списком файлов в каждом каталоге,
;и удаляем файлы не находящиеся в списке.
For $i = 1 To UBound($DirsArray)-1
;Получаем массив со списком файлов текущего каталога...
$InDirFilesArr = _FileListToArray($DirsArray[$i], "*.*", 1)
;Если в текущем каталоге найдены файлы, то проходимся по массиву и ищем текущий элемент в массиве списка исключенных файлов.
If IsArray($InDirFilesArr) Then
For $iF = 1 To UBound($InDirFilesArr)-1
;Поиск элемента (текущего файла включая полный путь)...
$SearchInArr = _ArraySearch($ExcludeListArr, $DirsArray[$i] & "\" & $InDirFilesArr[$iF])
;Если не найден, то удаляем файл...
If $SearchInArr = -1 Then $Extended += FileDelete($DirsArray[$i] & "\" & $InDirFilesArr[$iF])
Next
EndIf
Next
Return SetError(0, $Extended, 1)
EndFunc
;Функция возвращает массив структуры подкаталогов
Func _DirListToArray ($sPath)
Local $i, $j, $rlist[1]=[0], $blist, $alist=_FileListToArray ($sPath, '*', 2)
If IsArray ($alist) Then
For $i=1 To $alist [0]
_ArrayAdd ($rlist, $sPath & "\" & $alist [$i])
$blist = _DirListToArray ($sPath & "\" & $alist [$i])
If $blist[0]>0 Then
For $j=1 To $blist [0]
_ArrayAdd ($rlist, $blist [$j])
Next
EndIf
Next
EndIf
$rlist [0] = UBound ($rlist) - 1
Return $rlist
EndFunc