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

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

Пользователь


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

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


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

Последний раз редактировалось assch, 23-04-2012 в 01:41.


Отправлено: 23:25, 09-09-2010 | #2