Что нового

Может кто подскажет метод ускорения работы скрипта

lettterssino

Новичок
Сообщения
19
Репутация
1
Добрый день, написал маленький скрипт, который сравнивает 2 папки по файлам. А точнее сравнивает отличия в версии файлов и их размере, как они продвигаются. Т.к. сам не опытный в этом вопросе, но каким методом возможно ускорить его работу
Код:
#include <UIAutomate.au3>
#include <File.au3>
#include <Date.au3>
#include <FileOperations.au3>
#include <FileConstants.au3>
#include <Constants.au3>
#include <Encoding.au3>
#include <WinAPI.au3>
#include <Misc.au3>
#include <ScreenCapture.au3>
#include <Array.au3>
#RequireAdmin

_WinAPI_CreateFile (@DesktopDir & "\compare.log",1)

$Dir1Papka = FileSelectFolder ("Выберите первую папку",'',4)
if @error Then
    exit 1
    EndIf
$Dir2Papka= FileSelectFolder ("Выберите вторую папку",'',4)
if @error Then
    exit 1
    EndIf
$KolFile1papka = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 2, 1, 0) ; ищет количество файлов в папке с параметром 1

    Global $KolFile = $KolFile1papka[0] ; выводит количество файлов в папке



$hTimer = TimerInit()
ProgressOn("Сравнение файлов", '', '', -1, 100, 18)
$i = 0
$d = 0
While $i <= ($KolFile - 1) ; при верном условии цикл повторяется
    $Proc = (( $i + $d )/(($KolFile -1)*2))*100
    ProgressSet($Proc,"Проверенно файлов 1 стадия: " & $i & @CR & "Проверено файлов 2 стадия: " & $d,"Направление проверки: прямое")

    $aFileList1Papka = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 1, 2, 0) ; ищет полный путь к файлам
    $aFileListPapka1 = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 0, 2, 0) ; выводит относительный путь
    $aFileList1Papka1 = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 2, 2, 0) ; выводит короткое имя файла с расширением
    $Vers1 = FileGetVersion ($aFileList1Papka[$i])
    $FileSize1 = FileGetSize ($aFileList1Papka[$i])


        if FileExists ($Dir2Papka &'\' & $aFileListPapka1[$i]) = 1 Then

            $Vers2=FileGetVersion ($Dir2Papka &'\' & $aFileListPapka1[$i])
            $FileSize2= FileGetSize ($Dir2Papka &'\' & $aFileListPapka1[$i])

            If $FileSize1 <> $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                _FileWriteLog($hFile, $aFileList1Papka1[$i] & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
                _FileWriteLog($hFile, $aFileListPapka1[$i] & '    Версия: ' & $Vers2 & "    Размер: " & $FileSize2)
                _FileWriteLog($hFile, "")

            ElseIf  $FileSize1 = $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                _FileWriteLog($hFile, $aFileList1Papka1[$i] & '    Версия: ' & $Vers1 & "    Размер не изменился")
                _FileWriteLog($hFile, $aFileListPapka1[$i] & '    Версия: ' & $Vers2 & "    Размер не изменился")
                _FileWriteLog($hFile, "")

            ElseIf $FileSize1 <> $FileSize2 And $Vers1 = $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                _FileWriteLog($hFile, $aFileList1Papka1[$i] & '    Версия не изменилась' & "    Размер: " & $FileSize1 & "    <<====== Ошибка =====>>" )
                _FileWriteLog($hFile, $aFileListPapka1[$i] & '    Версия не изменилась' & "    Размер: " & $FileSize2 & "    <<====== Ошибка =====>>" )
                _FileWriteLog($hFile, "")


            EndIf

        Else
        Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
        _FileWriteLog($hFile, $aFileList1Papka1[$i] & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
        _FileWriteLog($hFile, "↑↑↑↑↑↑↑ Файла отсутствует во второй папке ↑↑↑↑↑↑↑")
        _FileWriteLog($hFile, "")
        EndIf

$i = $i + 1
WEnd
Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
_FileWriteLog($hFile, "        ====== ====== ====== ====== ====== ===== ====== ====== ======" )
_FileWriteLog($hFile, "        ====== ====== ====== ====== Реверс ===== ====== ====== ======" )
_FileWriteLog($hFile, "        ====== ====== ====== ====== ====== ===== ====== ====== ======" )
_FileWriteLog($hFile, "" )

$KolFile1papka = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 2, 1, 0) ; ищет количество файлов в папке с параметром 1

    Global $KolFile = $KolFile1papka[0] ; выводит количество файлов в папке


While $d <= ($KolFile - 1) ; при верном условии цикл повторяется
    $Proc = (( $i + $d )/(($KolFile -1)*2))*100
    ProgressSet($Proc,"Проверенно файлов 1 стадия: " & $i & @CR & "Проверено файлов 2 стадия: " & $d,"Направление проверки: прямое")

    $aFileList1Papka = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 1, 2, 0) ; ищет полный путь к файлам
    $aFileListPapka1 = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 0, 2, 0) ; выводит относительный путь
    $aFileList1Papka1 = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 2, 2, 0) ; выводит короткое имя файла с расширением
    $Vers1 = FileGetVersion ($aFileList1Papka[$d])
    $FileSize1 = FileGetSize ($aFileList1Papka[$d])


    if FileExists ($Dir2Papka &'\' & $aFileListPapka1[$d]) = 1 Then

        $Vers2=FileGetVersion ($Dir1Papka &'\' & $aFileListPapka1[$d])
        $FileSize2= FileGetSize ($Dir1Papka &'\' & $aFileListPapka1[$d])

        If $FileSize1 <> $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            _FileWriteLog($hFile, $aFileList1Papka1[$d] & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
            _FileWriteLog($hFile, $aFileListPapka1[$d] & '    Версия: ' & $Vers2 & "    Размер: " & $FileSize2)
            _FileWriteLog($hFile, "")

        ElseIf  $FileSize1 = $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            _FileWriteLog($hFile, $aFileList1Papka1[$d] & '    Версия: ' & $Vers1 & "    Размер не изменился")
            _FileWriteLog($hFile, $aFileListPapka1[$d] & '    Версия: ' & $Vers2 & "    Размер не изменился")
            _FileWriteLog($hFile, "")

        ElseIf $FileSize1 <> $FileSize2 And $Vers1 = $Vers2 And $Vers1 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            _FileWriteLog($hFile, $aFileList1Papka1[$d] & '    Версия не изменилась' & "    Размер: " & $FileSize1 & "    <<====== Ошибка =====>>" )
            _FileWriteLog($hFile, $aFileListPapka1[$d] & '    Версия не изменилась' & "    Размер: " & $FileSize2 & "    <<====== Ошибка =====>>" )
            _FileWriteLog($hFile, "")


        EndIf
    Else
    Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
    _FileWriteLog($hFile, $aFileList1Papka1[$d] & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
    _FileWriteLog($hFile, "↑↑↑↑↑↑↑ Файл отсутствует во второй папке ↑↑↑↑↑↑↑")
    _FileWriteLog($hFile, "")

    EndIf
$d  = $d  + 1
WEnd

    ProgressOff()
    Global $iDiff = TimerDiff($hTimer)
    Local $iDiffMinPrint = StringMid($iDiff / 60000, 1, 5)

    If MsgBox(4+32,'Открыть файла с результатами для чтения?', 'Потербовалось '& $iDiffMinPrint & ' мин., проверенно ' & ( $i + $d ) & ' файлов') = 6 Then
    ShellExecute (@DesktopDir & "\compare.log")
EndIf
 

Prog

Продвинутый
Сообщения
438
Репутация
53
Код:
$aFileList1Papka = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 1, 2, 0) ; ищет полный путь к файлам $aFileListPapka1 = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 0, 2, 0) ; выводит относительный путь $aFileList1Papka1 = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 2, 2, 0) ; выводит короткое имя файла с расширением
Этот код три раза сканирует те же файлы.
Лучше оставить только первую строку, а относительный путь и короткое имя получать из полного пути.

Чтобы найти файлы с отличиями, нужно проверять размер. Если изменился, отличия только есть.
При одинаковом размере, сравнивать хеш.
 

joiner

Модератор
Локальный модератор
Сообщения
3,464
Репутация
609
Есть хорошая тема

Проверять только изменившийся файл
 
Автор
L

lettterssino

Новичок
Сообщения
19
Репутация
1
Этот код три раза сканирует те же файлы.
Лучше оставить только первую строку, а относительный путь и короткое имя получать из полного пути.

Чтобы найти файлы с отличиями, нужно проверять размер. Если изменился, отличия только есть.
При одинаковом размере, сравнивать хеш.
Попробую, ну да что-то я переусердствовал
Есть хорошая тема

Проверять только изменившийся файл
Ну моих знаний пока, что не очень хватает как реализовать данную идею, но может быть в будущем пойму.
Сообщение автоматически объединено:

Решил свою проблему убрав последовательный поиск и исключив его из цикла, вдруг кому пригодится. Суть кода искать, когда файлы в разных версиях не продвигаются по версии при изменении размера, исключая файлы без версии.
Код:
#include <UIAutomate.au3>
#include <File.au3>
#include <Date.au3>
#include <FileOperations.au3>
#include <FileConstants.au3>
#include <Constants.au3>
#include <Encoding.au3>
#include <WinAPI.au3>
#include <Misc.au3>
#include <ScreenCapture.au3>
#include <Array.au3>
#RequireAdmin


_WinAPI_CloseHandle (_WinAPI_CreateFile (@DesktopDir & "\compare.log",1,4))

$Dir1Papka = FileSelectFolder ("Выберите первую папку",'',4)
if @error Then
    exit 1
    EndIf
$Dir2Papka= FileSelectFolder ("Выберите вторую папку",$Dir1Papka,4)
if @error Then
    exit 1
EndIf

;$Dir1Papka = 'D:\WRK\V21_21.0.0'
;$Dir2Papka = 'D:\WRK\V21'

$KolFileKolpapka = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 1, 1, 0,'','','.svn') ; ищет количество файлов в папке с параметром, исключая все совпадения с префиксом svn-base
Global $KolFile1 = $KolFileKolpapka[0] ; выводит количество файлов в папке

$KolFile2papka = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 1, 1, 0,'','','.svn') ; ищет количество файлов в папке с параметром 1
Global $KolFile2 = $KolFile2papka[0] ; выводит количество файлов в папке

$aFileList1Papka = _FO_FileSearch($Dir1Papka, 'svn-base', False, 125, 1, 2,0,'','','.svn') ; ищет полный путь к файлам
$aFileList2Papka = _FO_FileSearch($Dir2Papka, 'svn-base', False, 125, 1, 2,0,'','','.svn') ; ищет полный путь к файлам
Global $hFile = FileOpen (@DesktopDir & "\compare.log",1)

 $i = 0
 $d = 0
$hTimer = TimerInit()
ProgressOn("Сравнение файлов", '', '', -1, 100, 18)
While $i <= ($KolFile1 - 1)

    $Proc = (( $i + $d )/(($KolFile1 -1) + ($KolFile2 - 1)))*100
    ProgressSet($Proc,"Проверенно файлов 1 стадия: " & $i & ' ('& $KolFile1 &')' & @CR & "Проверенно файлов 2 стадия: " & $d & ' ('& $KolFile2 &')' ,"Направление проверки: прямое")
    $aFileListPapka1 = _PathGetRelative($Dir1Papka,$aFileList1Papka[$i]) ; выводит отнсительный путь
    $Vers1 = FileGetVersion ($aFileList1Papka[$i])
    $FileSize1 = FileGetSize ($aFileList1Papka[$i])

    if FileExists ($Dir2Papka &'\' & $aFileListPapka1) = 1 Then
            $Vers2 = FileGetVersion ($Dir2Papka &'\' & $aFileListPapka1)
            $FileSize2 = FileGetSize ($Dir2Papka &'\' & $aFileListPapka1)

            If $FileSize1 <> $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                FileWriteLine ($hFile, '1: ' & $aFileListPapka1 & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
                FileWriteLine ($hFile, '2: ' & $aFileListPapka1 & '    Версия: ' & $Vers2 & "    Размер: " & $FileSize2)
                FileWriteLine ($hFile, "")

            ElseIf  $FileSize1 = $FileSize2 And $Vers1 <> $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                FileWriteLine ($hFile, '1: ' & $aFileListPapka1 & '    Версия: ' & $Vers1 & "    Размер не изменился")
                FileWriteLine ($hFile, '2: ' & $aFileListPapka1 & '    Версия: ' & $Vers2 & "    Размер не изменился")
                FileWriteLine ($hFile, "")

            ElseIf $FileSize1 <> $FileSize2 And $Vers1 = $Vers2 And $Vers1 <> "0.0.0.0" Then
                Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
                FileWriteLine ($hFile, '1: ' & $aFileListPapka1 & '    Версия не изменилась' & "    Размер: " & $FileSize1 & "    <<====== Ошибка =====>>" )
                FileWriteLine ($hFile, '2: ' & $aFileListPapka1 & '    Версия не изменилась' & "    Размер: " & $FileSize2 & "    <<====== Ошибка =====>>" )
                FileWriteLine ($hFile, "")


            EndIf

    Else
        Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
        FileWriteLine ($hFile, '1: ' & $aFileListPapka1 & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
        FileWriteLine ($hFile, "↑↑↑↑↑↑↑ Файла отсутствует во второй папке " & $Dir2Papka & "↑↑↑↑↑↑↑")
        FileWriteLine ($hFile, "")
    EndIf

$i = $i + 1
WEnd

Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
FileWriteLine ($hFile, "        ====== ====== ====== ====== ====== ===== ====== ====== ======" )
FileWriteLine ($hFile, "        ====== ====== ====== ====== Реверс ===== ====== ====== ======" )
FileWriteLine ($hFile, "        ====== ====== ====== ====== ====== ===== ====== ====== ======" )
FileWriteLine ($hFile, "" )


While $d <= ($KolFile2 - 1) ; при верном условии цикл повторяется
    $Proc = (( $i + $d )/(($KolFile1 -1) + ($KolFile2 - 1)))*100
    ProgressSet($Proc,"Проверенно файлов 1 стадия: " & $i & @CR & "Проверенно файлов 2 стадия: " & $d,"Направление проверки: обратное")
    $aFileListPapka2 = _PathGetRelative($Dir2Papka,$aFileList2Papka[$d]) ; выводит отнсительный путь
    $Vers2 = FileGetVersion ($aFileList2Papka[$d])
    $FileSize2 = FileGetSize ($aFileList2Papka[$d])


    if FileExists ($Dir1Papka &'\' & $aFileListPapka2) = 1 Then
        $Vers1=FileGetVersion ($Dir1Papka &'\' & $aFileListPapka2)
        $FileSize1= FileGetSize ($Dir1Papka &'\' & $aFileListPapka2)
        If $FileSize2 <> $FileSize1 And $Vers2 <> $Vers1 And $Vers2 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            FileWriteLine ($hFile, '2: ' & $aFileListPapka2 & '    Версия: ' & $Vers2 & "    Размер: " & $FileSize2)
            FileWriteLine ($hFile, '1: ' & $aFileListPapka2 & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
            FileWriteLine ($hFile, "")

        ElseIf  $FileSize2 = $FileSize1 And $Vers2 <> $Vers1 And $Vers2 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            FileWriteLine ($hFile, '2: ' & $aFileListPapka2 & ' Версия: ' & $Vers2 & "    Размер не изменился")
            FileWriteLine ($hFile, '1: ' & $aFileListPapka2 & '    Версия: ' & $Vers1 & "    Размер не изменился")
            FileWriteLine ($hFile, "")

        ElseIf $FileSize2 <> $FileSize1 And $Vers2 = $Vers1 And $Vers2 <> "0.0.0.0" Then
            Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
            FileWriteLine ($hFile, '2: ' & $aFileListPapka2 & '    Версия не изменилась: ' & $Vers2 & "    Размер: " & $FileSize2 & "    <<====== Ошибка =====>>" )
            FileWriteLine ($hFile, '1: ' & $aFileListPapka2 & '    Версия не изменилась: ' & $Vers1 & "    Размер: " & $FileSize1 & "    <<====== Ошибка =====>>" )
            FileWriteLine ($hFile, "")


        EndIf
    Else
    Local $hFile = FileOpen(@DesktopDir & "\compare.log", 1)
    FileWriteLine ($hFile, '2: ' & $aFileListPapka2 & '    Версия: ' & $Vers1 & "    Размер: " & $FileSize1)
    FileWriteLine ($hFile, "↑↑↑↑↑↑↑ Файл отсутствует в первой папке  " & $Dir1Papka & " ↑↑↑↑↑↑↑")
    FileWriteLine ($hFile, "")

    EndIf
$d  = $d  + 1
WEnd


    ProgressOff()
    Global $iDiff = TimerDiff($hTimer)
    Local $iDiffMinPrint = StringMid($iDiff / 60000, 1, 5)


    If MsgBox(4+32,'Открыть файла с результатами для чтения?', 'Потербовалось '& $iDiffMinPrint & ' мин., проверенно ' & ( $i + $d ) & ' файлов') = 6 Then
    ShellExecute (@DesktopDir & "\compare.log")
    EndIf
 
Последнее редактирование:
Верх