( Dubletten - Finder ) bei Übereinstim.... der Dateinamen

  • Hi Leute!


    Fals einer gebrauchen kann habe ein Dubletten finden geschreiben!
    Fund bie 100% überinstimmung von Dateinamen!
    Ausgabe: Name der Datei und wie oft gefunden in 2D_Array!


    Func:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_Tren[4] = ['', '*', '\', '|'], $a_Save[1], $b_Save[1][2], $d_Save, $a_Ende, $a_Split, $z_0, $z_1, $z_2

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $F = _List_Folder_Dubel('D:\')
    _ArrayDisplay($F, TimerDiff($iTimer))

    [/autoit] [autoit][/autoit] [autoit]

    Func _List_Folder_Dubel($a_Pfad)
    If StringRight($a_Pfad, 1) <> $a_Tren[2] Then $a_Pfad = $a_Pfad & $a_Tren[2]
    ReDim $b_Save[999999][2]
    ReDim $a_Save[999999]
    $z_0 = 0
    $z_2 = 0
    _Show_Dubel($a_Pfad)
    ReDim $a_Save[$z_0]
    _ArraySort($a_Save)
    _Dubel_Finder($a_Save)
    ReDim $b_Save[$z_2][2]
    Return ($b_Save)
    EndFunc ;==>_List_Folder_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Show_Dubel($a_Pfad)
    Dim $a_D = _FileListToArray($a_Pfad, $a_Tren[1], 1)
    For $i = 1 To UBound($a_D) - 1
    $a_Save[$z_0] = $a_D[$i]
    $z_0 += 1
    Next
    Dim $a_V = _FileListToArray($a_Pfad, $a_Tren[1], 2)
    For $i = 1 To UBound($a_V) - 1
    _Show_Dubel($a_Pfad & $a_V[$i] & $a_Tren[2])
    Next
    EndFunc ;==>_Show_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dubel_Finder($c_Save)
    $a_Ende = UBound($c_Save) - 1
    For $i = 0 To $a_Ende Step +1
    ;ConsoleWrite($i & ' ' & $a_Ende & ' ' & $c_Save[$i] & @CRLF)
    If ($c_Save[$i] = $a_Tren[0]) Then ContinueLoop
    $z_1 = 0
    $d_Save = $a_Tren[0]
    For $j = $i To $a_Ende Step +1
    If (StringLeft($c_Save[$j], 5) <> StringLeft($c_Save[$i], 5) Or StringRight($c_Save[$j], 5) <> StringRight($c_Save[$i], 5)) Then ExitLoop
    If ($c_Save[$j] <> $c_Save[$i]) Then ContinueLoop
    $z_1 += 1
    $d_Save &= ($j & $a_Tren[3])
    Next
    If ($z_1 > 1) Then
    $b_Save[$z_2][0] = $c_Save[$i]
    $b_Save[$z_2][1] = $z_1
    $z_2 += 1
    $a_Split = StringSplit($d_Save, $a_Tren[3])
    For $e = 1 To UBound($a_Split) - 1
    $c_Save[$a_Split[$e]] = $a_Tren[0]
    Next
    EndIf
    Next
    EndFunc ;==>_Dubel_Finder

    [/autoit]


    Beispiel Func: Mit Pfad ausgabe

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_Tren[4] = ['', '*', '\', '|'], $a_Save[1][2], $b_Save[1][2], $a_Ende, $a_Zsave, $a_Split, $z_0, $z_1, $z_2

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $F = _List_Folder_Dubel('D:\')
    _ArrayDisplay($F, TimerDiff($iTimer))

    [/autoit] [autoit][/autoit] [autoit]

    Func _List_Folder_Dubel($a_Pfad)
    If StringRight($a_Pfad, 1) <> $a_Tren[2] Then $a_Pfad = $a_Pfad & $a_Tren[2]
    ReDim $b_Save[999999][2]
    ReDim $a_Save[999999][2]
    $z_0 = 0
    $z_2 = 0
    _Show_Dubel($a_Pfad)
    ReDim $a_Save[$z_0][2]
    _ArraySort($a_Save)
    _Dubel_Finder($a_Save)
    ReDim $b_Save[$z_2][2]
    Return ($b_Save)
    EndFunc ;==>_List_Folder_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Show_Dubel($a_Pfad)
    Dim $a_D = _FileListToArray($a_Pfad, $a_Tren[1], 1)
    For $i = 1 To UBound($a_D) - 1
    $a_Save[$z_0][0] = $a_D[$i]
    $a_Save[$z_0][1] = $a_Pfad & $a_D[$i]
    $z_0 += 1
    Next
    Dim $a_V = _FileListToArray($a_Pfad, $a_Tren[1], 2)
    For $i = 1 To UBound($a_V) - 1
    _Show_Dubel($a_Pfad & $a_V[$i] & $a_Tren[2])
    Next
    EndFunc ;==>_Show_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dubel_Finder($c_Save)
    $a_Ende = UBound($c_Save) - 1
    For $i = 0 To $a_Ende Step +1
    ;ConsoleWrite($i & ' ' & $a_Ende & ' ' & $c_Save[$i] & @CRLF)
    If ($c_Save[$i][0] = $a_Tren[0]) Then ContinueLoop
    $z_1 = 0
    $d_Save = $a_Tren[0]
    $a_Zsave = $a_Tren[0]
    For $j = $i To $a_Ende Step +1
    If (StringLeft($c_Save[$j][0], 5) <> StringLeft($c_Save[$i][0], 5) Or StringRight($c_Save[$j][0], 5) <> StringRight($c_Save[$i][0], 5)) Then ExitLoop
    If ($c_Save[$j][0] <> $c_Save[$i][0]) Then ContinueLoop
    $z_1 += 1
    $d_Save &= ($j & $a_Tren[3])
    $a_Zsave &= ($c_Save[$j][1] & $a_Tren[3]); man könnte das Array auch hir füllen
    Next
    If ($z_1 > 1) Then
    $b_Save[$z_2][0] = $c_Save[$i][0]
    $b_Save[$z_2][1] = $z_1
    $a_Split = StringSplit($a_Zsave, $a_Tren[3])
    $z_2 += 1 ; <---- Kann gelöscht werden ################################################## beispiel zum trennen der Ansicht!
    For $s = 1 To UBound($a_Split) - 1
    ;$z_2 += 1 ;<------------------------------ Aktivieren
    $b_Save[$z_2][0] = $a_Split[$s]
    $z_2 += 1; <------------------------------ Löschen
    Next
    $a_Split = StringSplit($d_Save, $a_Tren[3])
    For $e = 1 To UBound($a_Split) - 1
    $c_Save[$a_Split[$e]][0] = $a_Tren[0]
    Next
    EndIf
    Next
    EndFunc ;==>_Dubel_Finder

    [/autoit]


    Beispiel: Mit GUI

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $a_Tren[4] = ['', '*', '\', '|'], $a_Save[1][2], $b_Save[1][2], $a_Psave[1], $a_Ende, $a_Zsave, $a_Split, $a_NewSave, $z_0, $z_1, $z_2, $z_3, $a_W, $a_W1, $F, $a_La, $a_SU
    Global $Form, $a_PE, $a_PP, $hLVH, $hLVH1, $prog, $za = 0.2

    [/autoit] [autoit][/autoit] [autoit]

    $Form = GUICreate('Dubletten - Find - List', 670, 388, -1, -1)
    GUISetOnEvent(-3, '_Exit')
    $a_PE = GUICtrlCreateListView('', 8, 80, 250, 300)
    _GUICtrlListView_AddColumn($a_PE, 'Datei/Name', 166, 0)
    _GUICtrlListView_AddColumn($a_PE, 'Fund/Anzahl', 80, 1)
    _GUICtrlListView_SetExtendedListViewStyle($a_PE, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
    $hLVH = GUICtrlGetHandle($a_PE)
    $a_PP = GUICtrlCreateListView('', 260, 80, 402, 300)
    _GUICtrlListView_AddColumn($a_PP, 'Datei/Pfad', 500, 0)
    _GUICtrlListView_SetExtendedListViewStyle($a_PP, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_ONECLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
    $hLVH1 = GUICtrlGetHandle($a_PP)
    GUICtrlCreateButton('Suche Starten', 560, 15, 100, 50)
    GUICtrlSetOnEvent(-1, '_SDL')
    $prog = GUICtrlCreateProgress(8, 28, 544, 25)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    [/autoit] [autoit][/autoit] [autoit]

    Func _SDL()
    ;GUISetState(@SW_DISABLE, $Form)
    $F = _List_Folder_Dubel(FileSelectFolder('Bitte Zielverzeichnis auswählen', @DesktopDir, 2, '', $Form))
    ToolTip('Bitte warten...', Default, Default, 'Liste wird erstellt!', 1, 3)
    $a_W = $F[0]
    _GUICtrlListView_DeleteAllItems($hLVH)
    Sleep(100)
    If IsArray($a_W) Then
    _GUICtrlListView_BeginUpdate($a_PE)
    _GUICtrlListView_AddArray($hLVH, $a_W)
    _GUICtrlListView_EndUpdate($a_PE)
    EndIf
    _GUICtrlListView_SetColumnWidth($hLVH, 0, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_SetColumnWidth($hLVH, 1, $LVSCW_AUTOSIZE_USEHEADER)
    ToolTip('')
    ;GUISetState(@SW_ENABLE, $Form)
    EndFunc ;==>_SDL

    [/autoit] [autoit][/autoit] [autoit]

    Func _PAl()
    GUISetState(@SW_DISABLE, $Form)
    $a_W1 = $F[1]
    $a_NewSave = ''
    $a_La = _GUICtrlListView_GetItemText($a_PE, _GUICtrlListView_GetHotItem($a_PE))
    If IsArray($a_W1) Then
    For $i = 0 To UBound($a_W1) - 1
    $a_Split = StringSplit($a_W1[$i], $a_Tren[2])
    $a_SU = $a_Split[UBound($a_Split) - 1]
    If (StringLeft($a_SU, 5) <> StringLeft($a_La, 5) Or StringRight($a_SU, 5) <> StringRight($a_La, 5)) Then ContinueLoop
    If ($a_SU = $a_La) Then $a_NewSave &= $a_W1[$i] & $a_Tren[3]
    Next
    EndIf
    If ($a_NewSave = '') Then Return
    $a_Split = StringSplit($a_NewSave, $a_Tren[3])
    If IsArray($a_Split) Then
    _GUICtrlListView_BeginUpdate($hLVH1)
    For $i = 1 To UBound($a_Split) - 1
    GUICtrlCreateListViewItem($a_Split[$i], $a_PP)
    Next
    _GUICtrlListView_SetColumnWidth($hLVH1, 0, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_EndUpdate($hLVH1)
    EndIf
    GUISetState(@SW_ENABLE, $Form)
    EndFunc ;==>_PAl

    [/autoit] [autoit][/autoit] [autoit]

    Func _List_Folder_Dubel($a_Pfad)
    ToolTip('Benachrichtigung bei Aktionen' & @CRLF & 'Bitte warten...', Default, Default, 'Daten werden Eingelesen', 1, 3)
    ;GUISetState(@SW_HIDE, $Form)
    If StringRight($a_Pfad, 1) <> $a_Tren[2] Then $a_Pfad = $a_Pfad & $a_Tren[2]
    ReDim $b_Save[999999][2]
    ReDim $a_Save[999999][2]
    ReDim $a_Psave[999999]
    $z_0 = 0
    $z_2 = 0
    $z_3 = 0
    _Show_Dubel($a_Pfad)
    ReDim $a_Save[$z_0][2]
    _ArraySort($a_Save)
    ToolTip('')
    ToolTip('Bitte warten...', Default, Default, 'Prüfung gestartet!', 1)
    _Dubel_Finder($a_Save)
    ReDim $b_Save[$z_2][2]
    ReDim $a_Psave[$z_3]
    Dim $a_Dubbel_Save[2] = [$b_Save, $a_Psave]
    ;GUISetState(@SW_SHOW, $Form)
    ToolTip('')
    Return ($a_Dubbel_Save)
    EndFunc ;==>_List_Folder_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Show_Dubel($a_Pfad)
    Dim $a_D = _FileListToArray($a_Pfad, $a_Tren[1], 1);$a_Tren[1]
    For $i = 1 To UBound($a_D) - 1
    $a_Save[$z_0][0] = $a_D[$i]
    $a_Save[$z_0][1] = $a_Pfad & $a_D[$i]
    $z_0 += 1
    Next
    Dim $a_V = _FileListToArray($a_Pfad, $a_Tren[1], 2)
    For $i = 1 To UBound($a_V) - 1
    _Show_Dubel($a_Pfad & $a_V[$i] & $a_Tren[2])
    Next
    EndFunc ;==>_Show_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dubel_Finder($c_Save)
    $a_Ende = UBound($c_Save) - 1
    For $i = 0 To $a_Ende Step +1
    ;ConsoleWrite($i & ' ' & $a_Ende & ' ' & $c_Save[$i] & @CRLF)
    If ($c_Save[$i][0] = $a_Tren[0]) Then ContinueLoop
    $z_1 = 0
    $d_Save = $a_Tren[0]
    $a_Zsave = $a_Tren[0]
    For $j = $i To $a_Ende Step +1
    If (StringLeft($c_Save[$j][0], 5) <> StringLeft($c_Save[$i][0], 5) Or StringRight($c_Save[$j][0], 5) <> StringRight($c_Save[$i][0], 5)) Then ExitLoop
    If ($c_Save[$j][0] <> $c_Save[$i][0]) Then ContinueLoop
    $z_1 += 1
    $d_Save &= ($j & $a_Tren[3])
    $a_Zsave &= ($c_Save[$j][1] & $a_Tren[3])
    Next
    GUICtrlSetData($prog, $i * 100 / $a_Ende)
    If ($z_1 > 1) Then
    $b_Save[$z_2][0] = $c_Save[$i][0]
    $b_Save[$z_2][1] = $z_1
    $z_2 += 1
    $a_Split = StringSplit($a_Zsave, $a_Tren[3])
    For $s = 1 To UBound($a_Split) - 1
    $a_Psave[$z_3] = $a_Split[$s]
    $z_3 += 1
    Next
    $a_Split = StringSplit($d_Save, $a_Tren[3])
    For $e = 1 To UBound($a_Split) - 1
    $c_Save[$a_Split[$e]][0] = $a_Tren[0]
    Next
    EndIf
    Next
    EndFunc ;==>_Dubel_Finder

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hLVH
    If Not IsHWnd($hLVH) Then $hWndListView = GUICtrlGetHandle($hLVH)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    $iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_CLICK
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    ToolTip('Liste wird erstellt Bitte warten...', Default, Default, 'Speicher wird abgefragt!', 1, 3)
    _GUICtrlListView_DeleteAllItems($a_PP)
    _PAl()
    ToolTip('')
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit]

    While 1 * Sleep(10)
    WEnd

    [/autoit]


    Überarbeitete Version: um 50% Schneller

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_Tren[4] = ['', '*', '\', '|'], $a_Save[1][2], $b_Save[1][2], $d_Save, $a_Ende, $a_Split, $c_Save, $z_0, $z_1, $z_2
    Local $a_D, $a_D1, $a_Pfad

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $F = _List_Folder_Dubel('C:')
    _ArrayDisplay($F, TimerDiff($iTimer))

    [/autoit] [autoit][/autoit] [autoit]

    Func _List_Folder_Dubel($a_Pfad)
    If (StringRight($a_Pfad, 1) <> $a_Tren[2]) Then $a_Pfad = ($a_Pfad & $a_Tren[2])
    ReDim $b_Save[999999][2]
    ReDim $a_Save[999999][2]
    $z_0 = 0
    $z_2 = 0
    _Show_Dubel($a_Pfad)
    ReDim $a_Save[$z_0][2]
    _ArraySort($a_Save)
    _Dubel_Finder($a_Save)
    ReDim $b_Save[$z_2][2]
    Return ($b_Save)
    EndFunc ;==>_List_Folder_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Show_Dubel($a_Pfad)
    $a_D = FileFindFirstFile($a_Pfad & '*')
    If $a_D <> -1 Then
    Do
    $a_D1 = FileFindNextFile($a_D)
    If @error Then ExitLoop
    If @extended Then ContinueLoop
    $a_Save[$z_0][0] = $a_D1
    $a_Save[$z_0][1] = ($a_Pfad & $a_D1)
    $z_0 += 1
    Until 0
    FileClose($a_D)
    EndIf
    Dim $a_V = _FileListToArray($a_Pfad, $a_Tren[1], 2)
    For $i = 1 To UBound($a_V) - 1
    _Show_Dubel($a_Pfad & $a_V[$i] & $a_Tren[2])
    Next
    EndFunc ;==>_Show_Dubel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Dubel_Finder($c_Save)
    $a_Ende = UBound($c_Save) - 1
    For $i = 0 To $a_Ende
    $z_1 = 0
    $d_Save = $a_Tren[0]
    For $j = $i To $a_Ende
    If ($c_Save[$j][0] <> $c_Save[$i][0]) Then ExitLoop
    $z_1 += 1
    $d_Save &= ($c_Save[$j][1] & $a_Tren[3])
    Next
    If ($z_1 < 2) Then ContinueLoop
    $b_Save[$z_2][0] = $c_Save[$i][0]
    $b_Save[$z_2][1] = $d_Save
    $z_2 += 1
    $i += ($z_1 - 1)
    Next
    EndFunc ;==>_Dubel_Finder

    [/autoit]


    LG Kleiner

  • name22

    Dublette
    Bedeutung : Von Wikipedia

    Dublette (veraltet Doublette) (Lehnwort aus dem 18. Jahrhundert nach frz. doublet, zu double = doppelt) bezeichnet:

    autoBert
    Eine andere Version mit Pfad ausgabe! ;)
    Nur leider benötigt zum Vergleich um bis zu 10 sec. länger !
    Bei mir Drive Windows 81 600 und 2446 Dubletten 68 sec. ohne Pfad ausgabe 56 sec.

    edit: jetzt ausgabe mit leerZeilen vorher 2446 jetzt 91 817 Array einträge in 70 sec.


    LG Kleiner

    Einmal editiert, zuletzt von kleiner27 (13. März 2010 um 23:51)

  • Um nicht nur anhand der Dateinamen zu vergleichen bietet sich die Berechnung des Hashwertes mit der Crypt.au3 an.
    Das sollte aber ziemlich langwierig werden da für jede Datei der Hashwert berechnet werden muss.
    Wenn es, in kleinem Maße, doch mal jemand braucht hab ich mal 2 Funktionen geschrieben welche Dubletten anhand des Dateinamens bzw. anhand ihrer md5-Hash finden können:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Crypt.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Array = FindeDublettesByName(@SystemDir)
    _ArrayDisplay($Array, "Dubletten anhand Name")

    [/autoit] [autoit][/autoit] [autoit]

    $Array = FindeDublettesByHash(@SystemDir)
    _ArrayDisplay($Array, "Dubletten nach Hash-Wert")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ;===============================================================================
    ;
    ; Name...........: FindeDublettesByName
    ; Description ...: Findet Dateien deren Name mehrmals vorkommt
    ; Syntax.........: FindeDublettesByName($sStDir)
    ; Parameters ....: $sStDir - Startverzeichnis
    ; Return values .: Erfolg - 2D-Array mit Dateiname und Verzeichnissen getrennt durch |
    ; Fehler - Gibt -1 zurück und setzt @error:
    ; |1 - Fehler beim erstellen der Collections
    ; |2 - Startverzeichnis existiert nicht
    ; Author ........: AspirinJunkie
    ; Modified.......:
    ; Remarks .......: Benötigt .Net für Collections
    ; Related .......:
    ; Link ..........;
    ; Example .......; No
    ;
    ; ;==========================================================================================
    Func FindeDublettesByName($sStDir)
    Local $cSQueue = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 1, -1)
    Local $cRetQu = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 2, -1)
    Local $cFiles = ObjCreate("Scripting.Dictionary")
    If @error Then Return SetError(1, 3, -1)
    Local $cRet = ObjCreate("Scripting.Dictionary")
    If @error Then Return SetError(1, 3, -1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $FFFF, $FFNF, $sDir, $sTemp, $iCount = 1

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
    If Not FileExists($sStDir) Then Return SetError(2, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    $cSQueue.Enqueue($sStDir)

    [/autoit] [autoit][/autoit] [autoit]

    While $cSQueue.Count > 0
    $sDir = $cSQueue.Dequeue
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $cSQueue.Enqueue($sDir & '\' & $FFNF)
    Else
    If $cFiles.Exists($FFNF) Then
    If $cRet.Exists($FFNF) Then
    $sTemp = $cRet($FFNF)
    $cRet.Remove($FFNF)
    $cRet.Add($FFNF, $sTemp & '|' & $sDir)
    Else
    $cRet.Add($FFNF, $cFiles($FFNF) & '|' & $sDir)
    EndIf
    Else
    $cFiles.Add($FFNF, $sDir)
    EndIf
    EndIf
    Until 0
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet[$cRet.Count + 1][2]
    $aRet[0][0] = $cRet.Count
    For $i In $cRet.Keys
    $aRet[$iCount][0] = $i
    $aRet[$iCount][1] = $cRet($i)
    $iCount += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $aRet
    EndFunc ;==>FindeDublettesByName

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ;===============================================================================
    ;
    ; Name...........: FindeDublettesByHash
    ; Description ...: Findet doppelte Dateien anhand ihres Hash-Wertes
    ; Syntax.........: FindeDublettesByHash($sStDir)
    ; Parameters ....: $sStDir - Startverzeichnis
    ; $iMethod - Hash-Methode (siehe _Crypt_HashFile()) - Standard: md5
    ; Return values .: Erfolg - 1D-Array mit Dateipfaden getrennt durch |
    ; Fehler - Gibt -1 zurück und setzt @error:
    ; |1 - Fehler beim erstellen der Collections
    ; |2 - Startverzeichnis existiert nicht
    ; Author ........: AspirinJunkie
    ; Modified.......:
    ; Remarks .......: Benötigt .Net für Collections
    ; Related .......: Crypt.au3
    ; Link ..........;
    ; Example .......; No
    ;
    ; ;==========================================================================================
    Func FindeDublettesByHash($sStDir, $iMethod = 0x00008003)
    Local $cSQueue = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 1, -1)
    Local $cRetQu = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 2, -1)
    Local $cHashes = ObjCreate("Scripting.Dictionary")
    If @error Then Return SetError(1, 3, -1)
    Local $cRet = ObjCreate("Scripting.Dictionary")
    If @error Then Return SetError(1, 3, -1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $FFFF, $FFNF, $sDir, $iTemp, $iCount = 1
    Local $sHash

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
    If Not FileExists($sStDir) Then Return SetError(2, 0, "")

    [/autoit] [autoit][/autoit] [autoit]

    $cSQueue.Enqueue($sStDir)

    [/autoit] [autoit][/autoit] [autoit]

    While $cSQueue.Count > 0
    $sDir = $cSQueue.Dequeue
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $cSQueue.Enqueue($sDir & '\' & $FFNF)
    Else
    $sHash = String(_Crypt_HashFile($sDir & '\' & $FFNF, $iMethod))
    If $cHashes.Exists($sHash) Then
    If $cRet.Exists($sHash) Then
    $iTemp = $cRet($sHash)
    $cRet.Remove($sHash)
    $cRet.Add($sHash, $iTemp & '|' & $sDir & '\' & $FFNF)
    Else
    $cRet.Add($sHash, $cHashes($sHash) & '|' & $sDir & '\' & $FFNF)
    EndIf
    Else
    $cHashes.Add($sHash, $sDir & '\' & $FFNF)
    EndIf
    EndIf
    Until 0
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet[$cRet.Count + 1]
    $aRet[0] = $cRet.Count
    For $i In $cRet.Keys
    $aRet[$iCount] = $cRet($i)
    $iCount += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $aRet
    EndFunc ;==>FindeDublettesByHash

    [/autoit]

    2 Mal editiert, zuletzt von AspirinJunkie (14. März 2010 um 11:10)

  • Meinst du bei der md5-Berechnung oder den Vergleich allgemein?
    Weil bei der reinen Namensvergleichmethode bin ich mit der Performance erstmal recht zufrieden und hab auf Anhieb jetzt auch nicht mehr so viele Ansätze das noch wesentlich zu steigern.
    Wär natürlich über Hinweise deinerseits dazu erfreut.

  • AspirinJunkie
    Ich meine Md5-Berechnung denn du hast ja schon saubere arbeit geleistet! :D
    Versuche meine arbeit weiter zu entwickeln denn wo ich mir dein Code angeschaut habe hätte ich mir in den Ars..... beißen könne denn ich habe eine Func geschrieben die Rekursiv die Verzeichnise auflistet und da habe ich auch schon FileFindFirstFile verwendet , gleich eingebunden und noch ein paar änderungen schon 50% schneller gut gegen deine Func seh ich alt aus ;) aber z.B 3200 Datein zu vergleichen bin ich 1 sec. langsamer also um so größer die Datei anzahl um so langsamer bin ich gegen deine Func z.b 81 000 Datein [Deine zwischen 19 - 22 sec.] und [Meine zwischen 30-35 sec.]

    Ich habe im gefühl da geht noch was! :D

    Die 50% Schnellere Version Post#1

    LG Kleiner