Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как сравнить два текстовых файла и выявить изменения (http://forum.oszone.net/showthread.php?t=184579)

assch 03-09-2010 17:43 1488008

Как сравнить два текстовых файла и выявить изменения
 
С помощью этой быстрой функции (Спасибо Креатору) список файлов на диске С получился и записался в текстовый файл
за одну секунду если быть точным Time: 1.185 получилось 22000 строк тоесть 22000 файлов
Если проинсталировать какую нибудь програмку то получится например 22100 строк.
Всё это делается очень даже очень быстро.

А вот как получить текстовый файл со списком файлов только что ставших на диск С
То есть сравнить эти два файла
и выявить изменения
или убрать дубликаты?
с этим проблема.

Код этой функции

Код:

#Include <File.au3>

Global $Array = ""

_FindFiles('C:', '*')

$Txt = FileOpen('1.txt' ,2)

FileWrite($Txt, $Array)
FileClose($Txt)

Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 0)
       
    If Not @error Then
        For $i = 1 To $FileList[0]
         
                        $Array &= $sRoot & '\' & $FileList[$i] & @CRLF
                Next
    EndIf
       
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf

EndFunc


assch 09-09-2010 23:25 1492133

Функция для сравнения двух текстовых файлов.
Не большое дополнение : если не установлен Framework v2.0. эта функция работать не будет.

Код:

#Include <File.au3>
#include <Array.au3>

Global $Test1 = "Test1.txt"
Global $Test2 = "Test2.txt"
Global $aReturn
Global $aReturn_2
Global $sFilePath1 = '1.txt'
Global $sFilePath2 = '2.txt'
_FileReadToArray($sFilePath1, $aReturn)
_FileReadToArray($sFilePath2, $aReturn_2)
$Differece1 = _Diff($aReturn_2, $aReturn) ; первое сравнение при увеличении количества файлов
$Differece2 = _Diff($aReturn, $aReturn_2) ; второе сравнение при уменьшении количества файлов
$File1 = FileOpen($Test1, 1)
FileClose($File1)
_FileWriteFromArray($Test1, $Differece1, 1)  ;записывает в Test1.txt добавленные (разницу) файлы
$File2 = FileOpen($Test2, 1)
FileClose($File2)
_FileWriteFromArray($Test2, $Differece2, 1)  ;записывает в Test2.txt удалённые  файлы

Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
    Local $o1 = ObjCreate("System.Collections.ArrayList")
    Local $o2 = ObjCreate("System.Collections.ArrayList")
    Local $oUnion = ObjCreate("System.Collections.ArrayList")
    Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
    Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
    Local $tmp, $i
    If $GetAll <> 1 Then $GetAll = 0
    If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
    If Not IsArray($Set1) Then
        If Not StringInStr($Set1, $Delim) Then
            $o1.Add($Set1)
        Else
            $tmp = StringSplit($Set1, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o1.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set1) - 1
            $o1.Add($Set1[$i])
        Next
    EndIf
    If Not IsArray($Set2) Then
        If Not StringInStr($Set2, $Delim) Then
            $o2.Add($Set2)
        Else
            $tmp = StringSplit($Set2, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o2.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set2) - 1
            $o2.Add($Set2[$i])
        Next
    EndIf
    For $tmp In $o1
        If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
    Next
    For $tmp In $o1
        If $GetAll Then
            If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
        Else
            If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
        EndIf
    Next


    If $oDiff1.Count <= 0 Then Return 0

    Local $aOut[$oDiff1.Count]
    $i = 0
    For $tmp In $oDiff1
        $aOut[$i] = $tmp
        $i += 1
    Next
    Return $aOut
EndFunc



Время: 03:06.

Время: 03:06.
© OSzone.net 2001-