Функция для сравнения двух текстовых файлов.
Не большое дополнение : если не установлен 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
|