Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:41, 17-05-2007 | #410