Что нового

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

lettterssino

Знающий
Сообщения
109
Репутация
10
Добрый день, написал маленький скрипт, который сравнивает 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

Продвинутый
Сообщения
537
Репутация
65
Код:
$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,556
Репутация
628
Есть хорошая тема

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

lettterssino

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

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

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

Решил свою проблему убрав последовательный поиск и исключив его из цикла, вдруг кому пригодится. Суть кода искать, когда файлы в разных версиях не продвигаются по версии при изменении размера, исключая файлы без версии.
Код:
#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
 
Последнее редактирование:

avmaksimov

Новичок
Сообщения
46
Репутация
4
На самом деле, в любой задаче немаловажный момент - а стоит ли?!) SVN diff не пробовали? Или WinMerge? Куча параметров. Автоматизируйте их передачу и их возврат и, думаю, выхлоп будет гораздо красивее.
 
Верх