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
#include-once
#include <File.au3>
#include <Array.au3>
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))
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
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
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
Beispiel Func: Mit Pfad ausgabe
Spoiler anzeigen
#include-once
#include <File.au3>
#include <Array.au3>
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))
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
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
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
Beispiel: Mit GUI
Spoiler anzeigen
#include <Array.au3>
#include <File.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>
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
$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()
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
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
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
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
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
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
Func _Exit()
Exit
EndFunc ;==>_Exit
While 1 * Sleep(10)
WEnd
Überarbeitete Version: um 50% Schneller
Spoiler anzeigen
#include-once
#include <File.au3>
#include <Array.au3>
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
$iTimer = TimerInit()
$F = _List_Folder_Dubel('C:')
_ArrayDisplay($F, TimerDiff($iTimer))
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
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
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
LG Kleiner