Bild- (Film-) Dateien umbenennen in Reihenfolge der Erstellung

    • Offizieller Beitrag

    Es gibt von Oscar ein sehr schönes Skript (FileRenamer).
    Mein Skript ist ähnlich, aber mit einem anderen Hintergrund.
    Die meisten werden das kennen: Man fotografiert munter drauflos, gelegentlich auch ein Movie und dann wird das ganze in einen Ordner geschoben, z.B. "..Oma\Omas_75ter". An Weihnachten kommt dann noch "..Oma\Oma_Weih_2011" etc. pp. hinzu.
    So weit ist das ja schon halbwegs sortiert. Aber in dem Moment, wenn man Bildersammlungen zusammenstellt treten die Probleme auf: In allen Ordnern haben die Dateien dieselben Namen (RIMG00019.jpg o.ä.).
    Mein Ansatz ist folgender:
    - Die Dateien des Ordners werden nach Erstelldatum aufsteigend benannt als "Ordnername+Trennzeichen+Zähler+Dateiendung"
    - Trennzeichen und Stellenzahl des Zählers lassen sich in Einstellungen festlegen
    - Videodateien können wahlweise in einem Unterordner (Name frei wählbar) des Ordners abgelegt und ebenfalls umbenannt werden
    - Es können für komplette Bildersammlungen mit Unterordnern in einem Durchgang alle Dateien umbenannt werden
    - Zu berücksichtigende Dateitypen der Bild-/Videodateien sind individuell festlegbar
    - Unerwünschte Dateien (z.B. Thumbs.db o.ä.) können in einer Liste erfasst und dann während des Umbenennens gleich gelöscht werden
    - Alle gefundenen Dateien werden mit Erstelldatum im Listview angezeigt, Dateien können per Checkbox (Haken entfernen) vom Umbenennen ausgeschlossen werden
    - Im Programmordner wird eine "Settings.ini" mit den Einstellungen abgespeichert

    Zum Ausführen wird die "image_get_info.au3" (von Lazycat) benötigt. Ich habe sie mit angehängt.


    Edit: 18.06.2012
    Einige Neuerungen
    - Anzeige Anzahl eingelesener Bild-/Videodateien
    - Anzeige Anzahl schreibgeschützter Dateien
    - Radiobutton zum Wechsel Darstellung Dateipfade links-/rechts ausgerichtet im Listview
    - Button "Explorer": Öffnet den Explorer im Startordner der Auswahl
    - schreibgeschützte Dateien werden rot dargestellt, die Checkbox wird deaktiviert
    - Evtl. Fehler (Namenskonflikt-Zieldateiname existiert bereits; Umbenennen nicht erfolgreich) werden in eine "Rename.log" geschrieben.
    Falls Fehler auftreten wird die LOG-Datei automatisch geöffnet
    - Doppelklick: markierte Datei wird im Standardprogramm geöffnet
    - Rechtsklick: Kontextmenü
    --- Anzeige kpl. Dateipfad als Tooltip
    --- Anzeige aller Dateidetails
    --- Aufheben Schreibschutz für markierte Datei(en) (Färbung wieder normal, Checkbox wird aktiviert)

    Edit: 25.06.2012
    - Gefixed: Bug bei Button Explorer und Pfad mit Leerzeichen
    - Added: Optional kann zusätzlich ein temporäres Umbenennen mit (wählbarem) Präfix erfolgen. Nützlich, falls schon von Hand einzelne Dateien in die gewünschte Form umbenannt wurden.
    - Added: Im Listview werden bei Erfolg die neuen Dateinamen eingetragen und grün eingefärbt. Bei Fehler bleibt der alte Dateiname und wird orange-rot gefärbt.

    v0.6
    [autoit]

    #Region - TimeStamp
    ; 2012-06-25 13:47:54 v 0.6
    #EndRegion - TimeStamp

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

    #cs
    Im Skriptordner wird die Datei "Rename.log" erstellt mit der Fehlerprotokollierung.
    Die Datei wird bei jedem Neustart (Einlesen) gelöscht und beim Umbenennen neu geschrieben, sofern Fehler auftreten.
    #ce
    #Include <EditConstants.au3>
    #Include <GUIConstantsEx.au3>
    #Include <GuiListView.au3>
    #Include <GuiStatusBar.au3>
    #Include <ProgressConstants.au3>
    #Include <StaticConstants.au3>
    #Include <WindowsConstants.au3>
    #include "image_get_info.au3"

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

    #cs Settings.ini
    [General]
    Startpfad=
    n_stellig=4
    Delimiter=_
    SubFolder=1
    UsePrefix=0
    Prefix=
    Picture_Formate=JPG,JPEG
    Video_Folder_Create=1
    Video_Folder_Name=VIDEO
    Video_Formate=AVI,THM,MOV
    #ce

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

    Global $sPath = @ScriptDir & "\", $bData[2] = [1]
    $bData[1] &= "0x0000010001002020000001002000A810000016..." ; == für Post verkürzt dargestellt
    Global $bDatanames[1] = ["Rename Document.ico"]

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

    For $i = 1 To $bData[0]
    Local $sFile = $sPath & $bDatanames[$i -1]
    Local $hFileOut = FileOpen($sFile, 2+8+16)
    FileWrite($hFileOut, Binary($bData[$i]))
    FileClose($hFileOut)
    Next

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

    OnAutoItExitRegister("_DelBinaryTempFiles")

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

    Func _DelBinaryTempFiles()
    For $i = 1 To $bData[0]
    FileDelete($sPath & $bDatanames[$i -1])
    Next
    EndFunc

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

    Global $sFolder, $aFiles, $fSubFolder = False, $sINI = @ScriptDir & '\Settings.ini', $sLOG = @ScriptDir & '\Rename.log', $hLog, $index, $sDelFile
    Global $fDetail = False, $sFileDetail, $sItemTip, $iFolder = 1, $iSubFolder, $aCountFiles[2] = [0,0], $aItemID[1]
    Global $hStatus, $progress, $hProgress, $iStep, $aParts[2] = [160, -1]
    Global $sPathStart, $iCountNumbers, $sDelimiter, $sExt, $sExtPict, $sExtVideo, $iCreateVideoFolder, $sVideoFolder, $sDeleteList, $aListview[1][2]
    Global $lbCntPic, $lbCntVid, $lbCntErr, $iCntErr, $iCntReadOnly, $sReadOnly, $aCurrItem, $fShowContext = False
    Global $cbPrefixTmp, $lbPrefixTmp, $inPrefixTmp, $sPrefix, $iPrefix, $fPrefix = False
    If Not FileExists($sINI) Then
    IniWrite($sINI, 'General', 'Startpfad', '')
    IniWrite($sINI, 'General', 'n_stellig', 4)
    IniWrite($sINI, 'General', 'Delimiter', '_')
    IniWrite($sINI, 'General', 'SubFolder', 1)
    IniWrite($sINI, 'General', 'UsePrefix', 'N')
    IniWrite($sINI, 'General', 'Prefix', 'TMP')
    IniWrite($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
    IniWrite($sINI, 'General', 'Video_Folder_Create', 1)
    IniWrite($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
    IniWrite($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
    IniWrite($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
    EndIf

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

    $hGui = GUICreate("Dateien Umbenennen " & Chr(169) & "BugFix", 608, 535, 400, 50, Default, $GUI_WS_EX_PARENTDRAG)
    GUISetBkColor(0xFFFFBB)
    GUISetIcon($sPath & "\Rename Document.ico")
    GUICtrlCreateGroup(" Ordner Auswählen ", 15, 15, 570, 87)
    $mnu = GUICtrlCreateMenu('Menü')
    $mnuSettings = GUICtrlCreateMenuItem('Einstellungen', $mnu)
    GUICtrlCreateMenuItem('', $mnu)
    $mnuHelp = GUICtrlCreateMenuItem('Hilfe', $mnu)
    $inFolder = GUICtrlCreateInput("", 30, 40, 510, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1,0xFFFFFF)
    $btSelect = GUICtrlCreateButton("...", 550, 40, 20, 20)
    GUICtrlSetBkColor(-1, 0xFFD700)
    $cbSubFolder = GUICtrlCreateCheckbox('Unterordner mit einbeziehen', 30, 70, 180, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel('Fotos', 330, 64, 60, 17)
    $lbCntPic = GUICtrlCreateLabel('0', 405, 64, 30, 17, $ES_RIGHT)
    GUICtrlCreateLabel('Videos', 330, 81, 60, 17)
    $lbCntVid = GUICtrlCreateLabel('0', 405, 81, 30, 17, $ES_RIGHT)
    $btReadFiles = GUICtrlCreateButton('Einlesen', 480, 70, 90 ,22)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, 0x7FFF00)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup(" Datei - Infos ", 15, 112, 570, 340)
    GUICtrlCreateLabel('', 30, 132, 406, 23, $SS_ETCHEDFRAME)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $cbSelAll = GUICtrlCreateCheckbox(' Dateien ( Auswahl alle / Auswahl aufheben )', 39, 135, 280, 17)
    $rLeft = GUICtrlCreateRadio('links', 330, 135, 50, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $rRight = GUICtrlCreateRadio('rechts', 380, 135, 50, 17)
    GUICtrlCreateLabel('', 435, 132, 136, 23, $SS_ETCHEDFRAME)
    GUICtrlCreateLabel('Aufnahmezeitpunkt', 440, 136, 123, 17, $SS_CENTER)
    $ListView = GUICtrlCreateListView("Datei|Nr|Aufnahmezeitpunkt", 30, 154, 540, 283, BitOR($LVS_SHOWSELALWAYS,$LVS_REPORT,$LVS_NOCOLUMNHEADER) , BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT,$LVS_EX_CHECKBOXES,$LVS_EX_DOUBLEBUFFER))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 400)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 0)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, $LVSCW_AUTOSIZE_USEHEADER )
    $hLV = GUICtrlGetHandle($ListView)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $btExplorer = GUICtrlCreateButton('Explorer', 30, 462, 90 ,22)
    GUICtrlSetBkColor(-1, 0xFFD700)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $lbReadOnly = GUICtrlCreateLabel('', 150, 465, 145, 17)
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUICtrlCreateLabel('Fehler', 330, 465, 60, 17)
    $lbCntErr = GUICtrlCreateLabel('0', 405, 465, 30, 17, $ES_RIGHT)
    $btRename = GUICtrlCreateButton('Umbenennen', 480, 462, 90 ,22)
    GUICtrlSetBkColor(-1, 0xFA8072)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $hStatus = _GUICtrlStatusBar_Create ($hGui)
    _GUICtrlStatusBar_SetMinHeight ($hStatus, 20)
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)
    $inProgress = GUICtrlCreateInput('', 0, 1, 150, 20, BitOR($ES_READONLY,$ES_CENTER), $WS_EX_STATICEDGE)
    $hInProgress = GUICtrlGetHandle($inProgress)
    _GUICtrlStatusBar_EmbedControl($hStatus, 0, $hInProgress)
    $progress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
    GUICtrlSetColor(-1, 0x008B00)
    $hProgress = GUICtrlGetHandle($progress)
    _GUICtrlStatusBar_EmbedControl($hStatus, 1, $hProgress)

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

    $hContext = GUICreate('Listview Menü', 200, 69, -1, -1, $WS_POPUP, $WS_EX_MDICHILD, $hGui)
    GUICtrlCreateLabel('', 0, 0, 200, 23, $SS_ETCHEDFRAME)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ConPath = GUICtrlCreateLabel('Pfad Anzeigen', 10, 4, 188, 17)
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlCreateLabel('', 0, 23, 200, 23, $SS_ETCHEDFRAME)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ConDetail = GUICtrlCreateLabel('Details Anzeigen', 10, 27, 188, 17)
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlCreateLabel('', 0, 46, 200, 23, $SS_ETCHEDFRAME)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ConNoRO = GUICtrlCreateLabel('Schreibschutz Aufheben', 10, 50, 188, 17)
    GUICtrlSetColor(-1, 0x8B0000)

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

    $hSettings = GUICreate("Einstellungen", 561, 685, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
    GUISetBkColor(0xFFFFBB)
    GUISetIcon($sPath & "\Rename Document.ico")
    GUICtrlCreateGroup(" Startordner für Auswahl ", 20, 15, 520, 65)
    $inStartFolder = GUICtrlCreateInput("", 35, 40, 450, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $btFolderSelect = GUICtrlCreateButton("...", 500, 40, 20, 20)
    GUICtrlSetBkColor(-1, 0xFFD700)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup(" Verschiedenes ", 20, 95, 520, 95)
    $cbSubDir = GUICtrlCreateCheckbox(' Unterordner Durchsuchen', 35, 120, 150)
    GUICtrlCreateLabel("Trennzeichen", 210, 124, 80, 20)
    $inDelimiter = GUICtrlCreateInput("_", 285, 121, 30, 20)
    GUICtrlCreateLabel("Nummerierung Anzahl Ziffern", 345, 124, 140, 17)
    $inFileNum = GUICtrlCreateInput("4", 490, 121, 30, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
    $cbPrefixTmp = GUICtrlCreateCheckbox('Temporär umbenennen (Vermeidung Namenskollision)', 35, 150, 290)
    $lbPrefixTmp = GUICtrlCreateLabel('Präfix', 345, 154, 50)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $inPrefixTmp = GUICtrlCreateInput('TMP', 460, 151, 60, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup(" Bilder ", 20, 205, 520, 65)
    GUICtrlCreateLabel("Bildformate, kommagetrennt", 35, 230, 171, 20)
    $inFormatPict = GUICtrlCreateInput("JPG,JPEG", 230, 230, 290, 20)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup(" Video ", 20, 285, 520, 130)
    GUICtrlCreateLabel("Eigenen Ordner für Videos erstellen", 35, 315, 215, 20)
    $rVideoJa = GUICtrlCreateRadio("Ja", 310, 311, 50, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $rVideoNein = GUICtrlCreateRadio("Nein", 420, 311, 50, 17)
    GUICtrlCreateLabel("Name des Video Ordners", 35, 343, 160, 20)
    $inVideoFolder = GUICtrlCreateInput("VIDEO", 230, 342, 290, 20)
    GUICtrlCreateLabel("Videoformate, kommagetrennt", 35, 376, 185, 20)
    $inFormatVideo = GUICtrlCreateInput("AVI,THM,MOV", 230, 373, 290, 20)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup(" zu löschende Dateien ", 20, 430, 520, 200)
    $ListViewDel = GUICtrlCreateListView("|", 35, 455, 330, 160, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, $LVSCW_AUTOSIZE_USEHEADER)
    $hLVDel = GUICtrlGetHandle($ListViewDel)
    $btAddDelFile = GUICtrlCreateButton("Hinzufügen", 410, 455, 110, 25)
    GUICtrlSetBkColor(-1, 0x7FFF00)
    $btDelDelFile = GUICtrlCreateButton("Löschen", 410, 505, 110, 25)
    GUICtrlSetBkColor(-1, 0x00BFFF)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $btSave = GUICtrlCreateButton('Speichern', 410, 645, 110, 25)
    GUICtrlSetBkColor(-1, 0xFA8072)

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

    $hHelp = GUICreate("Hilfe", 641, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
    GUISetBkColor(0xFFFFBB)
    GUISetIcon($sPath & "\Rename Document.ico")
    $ListViewHelp = GuiCtrlCreateListView('||', 20, 20, 601, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
    GUICtrlSetBkColor(-1, 0xF5FFFA)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
    $sHelp = _
    'EINSTELLUNGEN|' & @CRLF & _
    ' "Startordner für Auswahl"|Root-Ordner zur Auswahl der Mediendateiordner' & @CRLF & _
    ' "Trennzeichen"|Zeichen zwischen Dateiname und Nummerierung' & @CRLF & _
    ' "Nummerierung Anzahl Ziffern"|Nummer in Dateinamen, Länge mit Vornullen' & @CRLF & _
    ' "Unterordner durchsuchen"|Alle Ordner unterhalb der Auswahl werden auch verwendet' & @CRLF & _
    ' "Bildformate"|Bilddateitypen, die umbenannt werden sollen' & @CRLF & _
    ' "Temporär Umbenennen"|Um Konflikte mit bereits existierenden Zieldateinamen' & @CRLF & _
    ' |zu vermeiden, werden alle Dateien vorab mit dem gewählten Präfix' & @CRLF & _
    ' |umbenannt und erst dann in der endgültigen Form gespeichert.' & @CRLF & _
    ' "Videoordner erstellen"|Eigenen Ordner für Videos in jeweiligem Ordner erstellen' & @CRLF & _
    '|Alle Videodateien des Ordners werden dorthin verschoben' & @CRLF & _
    ' "Name Video Ordner"|Bezeichnung für anzulegende Videoordner' & @CRLF & _
    ' "Videoformate"|Videodateitypen, die umbenannt werden sollen' & @CRLF & _
    ' "zu löschende Dateien"|Dateien, die in den Ordnern gelöscht werden sollen' & @CRLF & _
    '|' & @CRLF & _
    'PROGRAMM|' & @CRLF & _
    ' "Ordner auswählen"|Ordner dessen Mediendateien umbenannt werden sollen' & @CRLF & _
    '|Anwenden auf Unterordner kann unabhängig von den Vor-' & @CRLF & _
    '|einstellungen gesetzt werden' & @CRLF & _
    ' < Einlesen >|Der/Die (Unter)Ordner werden nach den Dateitypen durchsucht.' & @CRLF & _
    '|Gefundenes wird mit Pfad in das Listview eingetragen.' & @CRLF & _
    '|Das Erstelldatum wird in Spalte 2 angezeigt.' & @CRLF & _
    ' "Checkbox Auswahl Dateien"|Auswählen/Auswahl aufheben für alle Dateien' & @CRLF & _
    '|Ausgewählte Dateien werden umbenannt' & @CRLF & _
    ' "Radio links / rechts"|Ausrichtung Dateipfade im Listview' & @CRLF & _
    ' < Explorer >|Öffnet Explorer im Startordner Auswahl' & @CRLF & _
    ' < Umbenennen >|Gewählte Dateien werden umbenannt in:' & @CRLF & _
    '|ORDNERNAME-TRENNZEICHEN-NUMMER' & @CRLF & _
    '|Nummer ansteigend geordnet nach Erstelldatum' & @CRLF & _
    '|Die Nummerierung beginnt in jedem Ordner bei 1' & @CRLF & _
    '|Videos haben eine eigene Nummerierung' & @CRLF & _
    '|' & @CRLF & _
    'LISTVIEW FUNKTIONEN|' & @CRLF & _
    ' Doppel-Klick|Öffnet die Datei im Standardprogramm' & @CRLF & _
    ' Rechts-Klick|Kontext-Menü' & @CRLF & _
    '| Kompletter Dateipfad als Tooltipp' & @CRLF & _
    '| Alle verfügbaren Details von Bilddateien' & @CRLF & _
    '| Aufheben Schreibschutz markierter Datei(en)' & @CRLF & _
    '|' & @CRLF & _
    'FEHLERBEHANDLUNG|' & @CRLF & _
    '|Anzahl der Fehler wird auf der Oberfläche angezeigt' & @CRLF & _
    '|Im Programmordner wird eine Datei "Rename.log" erstellt,' & @CRLF & _
    '|dort werden Fehler protokolliert.' & @CRLF & _
    '|Treten Fehler auf, wird "Rename.log" im Standardeditor geöffnet.' & @CRLF & _
    '|' & @CRLF & _
    'TIPP|' & @CRLF & _
    '|Treten beim Umbenennen Namenskonflikte wegen bereits' & @CRLF & _
    '|existierender Zieldateien auf:' & @CRLF & _
    '| - Einstellungen "Temporär Umbenennen" aktivieren' & @CRLF & _
    '| - Dateien erneut < Einlesen >' & @CRLF & _
    '| - < Umbenennen >'
    $aItem = StringSplit($sHelp, @CRLF, 1)
    For $i = 1 To $aItem[0]
    GUICtrlCreateListViewItem($aItem[$i], $ListViewHelp)
    GUICtrlSetBkColor(-1, 0xFFFFF0)
    Next

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

    $hDetail = GUICreate("Details", 561, 618, -1, -1, Default, $WS_EX_MDICHILD, $hGui)
    GUISetBkColor(0xFFFFBB)
    GUISetIcon($sPath & "\Rename Document.ico")
    $ListViewDetail = GuiCtrlCreateListView('||', 20, 20, 521, 578, BitOR($GUI_SS_DEFAULT_LISTVIEW,$LVS_NOCOLUMNHEADER), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
    GUICtrlSetBkColor(-1, 0xF5FFFA)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 200)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, $LVSCW_AUTOSIZE_USEHEADER)
    $hLVDetail = GUICtrlGetHandle($ListViewDetail)

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

    _ReadSettingsFromINI()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUISetState(@SW_SHOW, $hGui)

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

    While 1
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    If $aMsg[1] = $hSettings Then
    GUISetState(@SW_HIDE, $hSettings)
    ElseIf $aMsg[1] = $hDetail Then
    GUISetState(@SW_HIDE, $hDetail)
    ElseIf $aMsg[1] = $hHelp Then
    GUISetState(@SW_HIDE, $hHelp)
    Else
    Exit
    EndIf
    Case $GUI_EVENT_PRIMARYUP
    If $fShowContext Then
    $aMPos = MouseGetPos()
    $tPoint = DllStructCreate('int;int')
    DllStructSetData($tPoint, 1, $aMPos[0])
    DllStructSetData($tPoint, 2, $aMPos[1])
    $tRectContext = _WinAPI_GetWindowRect($hContext)
    If Not _WinAPI_PtInRect($tRectContext, $tPoint) Then
    GUISetState(@SW_HIDE, $hContext)
    $fShowContext = False
    EndIf
    EndIf
    Case $mnuSettings
    _SettingsSet()
    GUISetState(@SW_SHOW, $hSettings)
    Case $mnuHelp
    GUISetState(@SW_SHOW, $hHelp)
    Case $ConPath
    GUISetState(@SW_HIDE, $hContext)
    $aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
    If $aCurrItem[0] <> 0 Then _ToolTipMouseExit(_GUICtrlListView_GetItemText($hLV, $aCurrItem[1]), 4000)
    Case $ConDetail ; == Dateidetail, bei mehreren markierten Dateien wird nur die erste Datei der Markierung verwendet
    GUISetState(@SW_HIDE, $hContext)
    $aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
    If $aCurrItem[0] <> 0 Then
    $sFileDetail = _GUICtrlListView_GetItemText($hLV, $aCurrItem[1])
    _ShowDetail()
    EndIf
    Case $ConNoRO ; == Schreibschutz aufheben, bei mehreren markierten Dateien wird der Schreibschutz für alle markierten Dateien aufgehoben
    GUISetState(@SW_HIDE, $hContext)
    $aCurrItem = _GUICtrlListView_GetSelectedIndices($hLV, True)
    For $i = 1 To $aCurrItem[0]
    If Not FileSetAttrib(_GUICtrlListView_GetItemText($hLV, $aCurrItem[$i]), '-R') Then
    MsgBox(262160, "Fehler", "Der Schreibschutz für diese Datei konnte nicht aufgehoben werden.")
    Else
    _GUICtrlListView_SetItemChecked($hLV, $aCurrItem[$i])
    GUICtrlSetColor($aItemID[$aCurrItem[$i]], 0x00008B)
    $sReadOnly = StringReplace($sReadOnly, ' ' & $aCurrItem[$i] & ' ', ' ')
    $iCntReadOnly -= 1
    If $iCntReadOnly = 0 Then
    GUICtrlSetState($lbReadOnly, $GUI_HIDE)
    Else
    GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
    EndIf
    EndIf
    Next
    Case $btSelect
    GUICtrlSetData($lbCntErr, 0)
    GUICtrlSetData($lbCntPic, 0)
    GUICtrlSetData($lbCntVid, 0)
    GUICtrlSetData($progress, 0)
    $sFolder = FileSelectFolder('Ordner mit Bildern auswählen', $sPathStart)
    If $sFolder <> '' Then
    GUICtrlSetData($inFolder, $sFolder)
    GUICtrlSetState($btReadFiles, $GUI_ENABLE)
    GUICtrlSetState($cbSubFolder, $GUI_ENABLE)
    GUICtrlSetState($btExplorer, $GUI_ENABLE)
    GUICtrlSetState($lbReadOnly, $GUI_HIDE)
    GUICtrlSetData($progress, 0)
    GUICtrlSetData($inProgress, '')
    EndIf
    Case $cbSubFolder
    If BitAND(GUICtrlRead($cbSubFolder), $GUI_CHECKED) Then
    $fSubFolder = True
    Else
    $fSubFolder = False
    EndIf
    Case $btReadFiles
    GUICtrlSetState($cbSubFolder, $GUI_DISABLE)
    If FileExists($sLOG) Then FileDelete($sLOG)
    $aCountFiles[0] = 0
    $aCountFiles[1] = 0
    $iCntErr = 0
    $iCntReadOnly = 0
    $sReadOnly = ' '
    _LoadListview()
    If $iCntReadOnly > 0 Then
    GUICtrlSetState($lbReadOnly, $GUI_SHOW)
    GUICtrlSetData($lbReadOnly, 'Schreibgeschützt: ' & $iCntReadOnly)
    EndIf
    Case $cbSelAll
    If _GUICtrlListView_GetItemCount($hLV) > 0 Then
    If BitAND(GUICtrlRead($cbSelAll), $GUI_CHECKED) Then
    _CheckAll(True)
    Else
    _CheckAll(False)
    EndIf
    Else
    GUICtrlSetState($cbSelAll, $GUI_UNCHECKED)
    EndIf
    Case $cbPrefixTmp
    If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then
    GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
    GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
    $fPrefix = True
    Else
    GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
    GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
    $fPrefix = False
    EndIf
    Case $rLeft, $rRight
    If BitAND(GUICtrlRead($rLeft), $GUI_CHECKED) Then
    _GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 0)
    Else
    _GUICtrlListView_SetColumn($hLV, 0, 'Datei', -1, 1)
    EndIf
    _WinAPI_RedrawWindow($hLV)
    Case $btExplorer
    If $sFolder <> '' Then Run('explorer.exe /root,"' & $sFolder & '"')
    Case $btRename
    GUICtrlSetState($btRename, $GUI_DISABLE)
    $hLog = FileOpen($sLOG, 9)
    _RenameFiles()
    FileClose($hLog)
    Case $btFolderSelect
    $sPathStart = FileSelectFolder('Start Ordner auswählen', '')
    If $sPathStart <> '' Then GUICtrlSetData($inStartFolder, $sPathStart)
    Case $btAddDelFile
    $sDelFile = FileOpenDialog('Dateien zum Löschen wählen', $sPathStart, 'Alle(*.*)')
    If $sDelFile <> '' Then GUICtrlCreateListViewItem(StringTrimLeft($sDelFile, StringInStr($sDelFile, '\', 1, -1)) , $ListViewDel)
    Case $btDelDelFile
    _GUICtrlListView_DeleteItemsSelected($hLVDel)
    Case $btSave
    _WriteSettingsToINI()
    GUISetState(@SW_HIDE, $hSettings)
    EndSwitch
    WEnd

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

    Func _RenameFiles()
    GUICtrlSetData($inProgress, 'Dateien Umbenennen [0%]')
    GUICtrlSetData($progress, 0)
    Local $iItem = _GUICtrlListView_GetItemCount($hLV)
    Local $iStep = 100/$iItem
    Local $nPIC = 0, $nVID = 0, $sItem, $sFile, $sSfx, $sPath, $sNewItem, $sFolder, $sNewPath, $sLastPath, $fCheck = False
    Local $aFilesToDelete = StringSplit($sDeleteList, ',')
    _GUICtrlListView_BeginUpdate($hLV)
    If $fPrefix Then ; == vorher umbenennen mit Präfix
    For $i = 0 To $iItem -1
    GUICtrlSetData($progress, ($i+1)*$iStep)
    GUICtrlSetData($inProgress, 'Temporär Umbenennen [' & Int(($i+1)*$iStep) & '%]')
    If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
    $sItem = _GUICtrlListView_GetItemText($hLV, $i)
    $sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1))
    $sFile = StringTrimLeft($sItem, StringLen($sPath))
    $sNewItem = $sPath & $sPrefix & '_' & $sFile
    If FileMove($sItem, $sNewItem) Then
    _GUICtrlListView_SetItemText($hLV, $i, $sNewItem)
    Else
    _GUICtrlListView_SetItemChecked($hLV, $i, False)
    GUICtrlSetColor($aItemID[$i], 0xFF1493)
    FileWrite($hLog, 'FEHLER_PRÄFIX "' & $sItem & '" konnte nicht zu "' & $sNewItem & '" umbenannt werden!' & @CRLF)
    $iCntErr += 1
    EndIf
    Next
    EndIf
    For $i = 0 To $iItem -1
    GUICtrlSetData($progress, ($i+1)*$iStep)
    GUICtrlSetData($inProgress, 'Dateien Umbenennen [' & Int(($i+1)*$iStep) & '%]')
    $sItem = _GUICtrlListView_GetItemText($hLV, $i)
    $sSfx = StringTrimLeft($sItem, StringInStr($sItem, '.', 1, -1))
    $sPath = StringLeft($sItem, StringInStr($sItem, '\', 1, -1) -1)
    $sFolder = StringTrimLeft($sPath, StringInStr($sPath, '\', 1, -1))
    If $sPath <> $sLastPath Then
    $sLastPath = $sPath
    $fCheck = True
    $nPIC = 0
    $nVID = 0
    EndIf
    If Not _GUICtrlListView_GetItemChecked($hLV, $i) Then ContinueLoop
    Select
    Case StringInStr($sExtPict, $sSfx)
    $nPIC += 1
    $sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nPIC) & '.' & StringLower($sSfx)
    If FileExists($sNewPath) Then
    $iCntErr += 1
    FileWrite($hLog, 'NAMENSKONFLIKT "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
    Else
    If FileMove($sItem, $sNewPath) = 0 Then
    $iCntErr += 1
    FileWrite($hLog, 'FEHLER_VERSCHIEBEN ' & $sItem & @CRLF)
    GUICtrlSetColor($aItemID[$i], 0xFF1493)
    Else
    _GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
    GUICtrlSetColor($aItemID[$i], 0x228B22)
    EndIf
    EndIf
    ;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ')' & @CRLF)
    Case StringInStr($sExtVideo, $sSfx)
    If $iCreateVideoFolder = 1 Then
    Local $sLenVid = StringLen($sVideoFolder), $sLenPath = StringLen($sPath)
    If ($sLenPath > $sLenVid And StringRight($sPath, $sLenVid) <> $sVideoFolder) Or ($sLenPath < $sLenVid) Then $sPath &= '\' & $sVideoFolder
    EndIf
    $nVID += 1
    If StringRight($sFolder, StringLen($sVideoFolder)) = $sVideoFolder Then
    Local $sTmp = StringTrimRight($sPath, StringLen($sVideoFolder) +1)
    $sFolder = StringTrimLeft($sTmp, StringInStr($sTmp, '\', 1, -1))
    EndIf
    $sNewPath = $sPath & '\' & $sFolder & $sDelimiter & StringFormat('%0' & $iCountNumbers & 'd', $nVID) & '.' & StringLower($sSfx)
    If FileExists($sNewPath) Then
    $iCntErr += 1
    FileWrite($hLog, 'NAMENSKONFLIKT "' & $sItem & '" konnte nicht zu "' & $sNewPath & '" umbenannt werden, da diese Datei bereits existiert!' & @CRLF)
    Else
    If FileMove($sItem, $sNewPath, 8) = 0 Then
    $iCntErr += 1
    FileWrite($hLog, 'FEHLER_VERSCHIEBEN "' & $sItem & '" nach "' & $sNewPath & '"' & @CRLF)
    GUICtrlSetColor($aItemID[$i], 0xFF1493)
    Else
    _GUICtrlListView_SetItemText($hLV, $i, $sNewPath)
    GUICtrlSetColor($aItemID[$i], 0x228B22)
    EndIf
    EndIf
    ;~ ConsoleWrite(_OutputLen('+> FileMove(' & $sItem, 100) & $sNewPath & ', 8)' & @CRLF)
    EndSelect
    If $fCheck Then
    $fCheck = False
    If UBound($aFilesToDelete) > 1 Then
    For $j = 1 To $aFilesToDelete[0]
    If FileExists($sPath & '\' & $aFilesToDelete[$j]) Then
    If FileDelete($sPath & '\' & $aFilesToDelete[$j]) = 0 Then
    $iCntErr += 1
    FileWrite($hLog, 'FEHLER_LÖSCHEN ' & $sPath & '\' & $aFilesToDelete[$j] & @CRLF)
    EndIf
    ;~ ConsoleWrite('!> FileDelete(' & $sPath & '\' & $aFilesToDelete[$j] & ')' & @CRLF)
    EndIf
    Next
    EndIf
    EndIf
    Next
    _GUICtrlListView_EndUpdate($hLV)
    GUICtrlSetData($progress, 100)
    GUICtrlSetData($inProgress, 'Dateien Umbenennen [100%]')
    GUICtrlSetData($lbCntErr, $iCntErr)
    If $iCntErr > 0 Then ShellExecute($sLOG)
    EndFunc

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

    ;==================================================================================
    Func _OutputLen($_s, $_iLen, $_sFill='.') ; == NUR FÜR KONSOLENAUSGABE IM TEST
    Local $sLen = StringLen($_s)
    If $_iLen <= $sLen Then Return $_s & $_sFill
    For $i = $sLen To $_iLen
    $_s &= $_sFill
    Next
    Return $_s
    EndFunc
    ;==================================================================================

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

    Func _ShowDetail()
    If $sFileDetail = '' Then Return
    Local $sInfo = _ImageGetInfo($sFileDetail)
    Local $aTmp, $aSplit = StringSplit(StringTrimRight($sInfo, 1), @LF, 1)
    If @error Then Return
    _GUICtrlListView_DeleteAllItems($hLVDetail)
    For $i = 1 To $aSplit[0]
    $aTmp = StringSplit($aSplit[$i], '=')
    If StringLen(StringStripWS($aTmp[2], 8)) Then
    GUICtrlCreateListViewItem($aTmp[1] & '|' & StringStripWS($aTmp[2], 2), $ListViewDetail)
    GUICtrlSetBkColor(-1, 0xFFFFF0)
    EndIf
    Next
    WinSetTitle($hDetail, '', 'Details von "' & StringTrimLeft($sFileDetail, StringInStr($sFileDetail, '\', 1, -1)) & '"')
    GUISetState(@SW_SHOW, $hDetail)
    EndFunc

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

    Func _ReadSettingsFromINI()
    $sPathStart = IniRead($sINI, 'General', 'Startpfad', '')
    $iCountNumbers = IniRead($sINI, 'General', 'n_stellig', 4)
    $sDelimiter = IniRead($sINI, 'General', 'Delimiter', '_')
    $iSubFolder = IniRead($sINI, 'General', 'SubFolder', 1)
    If $iSubFolder = 1 Then
    GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
    $fSubFolder = True
    Else
    GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
    EndIf
    $iPrefix = IniRead($sINI, 'General', 'UsePrefix', 0)
    If $iPrefix = 1 Then
    GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
    $fPrefix = True
    Else
    GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
    EndIf
    $sPrefix = IniRead($sINI, 'General', 'Prefix', 'TMP')
    $sExtPict = IniRead($sINI, 'General', 'Picture_Formate', 'JPG,JPEG')
    $sExtVideo = IniRead($sINI, 'General', 'Video_Formate', 'AVI,THM,MOV')
    If $sExtVideo <> '' Then
    $sExt = $sExtPict & ',' & $sExtVideo
    Else
    $sExt = $sExtPict
    EndIf
    $iCreateVideoFolder = IniRead($sINI, 'General', 'Video_Folder_Create', 1)
    $sVideoFolder = IniRead($sINI, 'General', 'Video_Folder_Name', 'VIDEO')
    $sDeleteList = IniRead($sINI, 'General', 'DeleteList', 'Thumbs.db,Thumbnail.info,Vorschau.pic')
    EndFunc

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

    Func _WriteSettingsToINI()
    $sPathStart = GUICtrlRead($inStartFolder)
    IniWrite($sINI, 'General', 'Startpfad', $sPathStart)
    $iCountNumbers = GUICtrlRead($inFileNum)
    IniWrite($sINI, 'General', 'n_stellig', $iCountNumbers)
    $iSubFolder = 0
    If BitAND(GUICtrlRead($cbSubDir), $GUI_CHECKED) Then $iSubFolder = 1
    IniWrite($sINI, 'General', 'SubFolder', $iSubFolder)
    If $iSubFolder = 1 Then
    GUICtrlSetState($cbSubFolder, $GUI_CHECKED)
    Else
    GUICtrlSetState($cbSubFolder, $GUI_UNCHECKED)
    EndIf
    $sDelimiter = GUICtrlRead($inDelimiter)
    IniWrite($sINI, 'General', 'Delimiter', $sDelimiter)
    $iPrefix = 0
    If BitAND(GUICtrlRead($cbPrefixTmp), $GUI_CHECKED) Then $iPrefix = 1
    IniWrite($sINI, 'General', 'UsePrefix', $iPrefix)
    IniWrite($sINI, 'General', 'Prefix', GUICtrlRead($inPrefixTmp))
    $sExtPict = GUICtrlRead($inFormatPict)
    IniWrite($sINI, 'General', 'Picture_Formate', $sExtPict)
    $sExtVideo = GUICtrlRead($inFormatVideo)
    IniWrite($sINI, 'General', 'Video_Formate', $sExtVideo)
    If $sExtVideo <> '' Then
    $sExt = $sExtPict & ',' & $sExtVideo
    Else
    $sExt = $sExtPict
    EndIf
    $iCreateVideoFolder = 1
    If BitAND(GUICtrlRead($rVideoJa), $GUI_UNCHECKED) Then $iCreateVideoFolder = 0
    IniWrite($sINI, 'General', 'Video_Folder_Create', $iCreateVideoFolder)
    $sVideoFolder = GUICtrlRead($inVideoFolder)
    IniWrite($sINI, 'General', 'Video_Folder_Name', $sVideoFolder)
    $sDeleteList = ''
    For $i = 0 To _GUICtrlListView_GetItemCount($hLVDel) -1
    $sDeleteList &= _GUICtrlListView_GetItemText($hLVDel, $i) & ','
    Next
    If $sDeleteList <> '' Then $sDeleteList = StringTrimRight($sDeleteList, 1)
    IniWrite($sINI, 'General', 'DeleteList', $sDeleteList)
    EndFunc

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

    Func _SettingsSet()
    GUICtrlSetData($inStartFolder, $sPathStart)
    GUICtrlSetData($inFileNum, $iCountNumbers)
    GUICtrlSetData($inDelimiter, $sDelimiter)
    GUICtrlSetData($inVideoFolder, $sVideoFolder)
    GUICtrlSetData($inFormatVideo, $sExtVideo)
    GUICtrlSetData($inFormatPict, $sExtPict)
    If $iSubFolder = 1 Then
    GUICtrlSetState($cbSubDir, $GUI_CHECKED)
    Else
    GUICtrlSetState($cbSubDir, $GUI_UNCHECKED)
    EndIf
    If $iPrefix = 1 Then
    GUICtrlSetState($cbPrefixTmp, $GUI_CHECKED)
    GUICtrlSetState($lbPrefixTmp, $GUI_ENABLE)
    GUICtrlSetState($inPrefixTmp, $GUI_ENABLE)
    $fPrefix = True
    Else
    GUICtrlSetState($cbPrefixTmp, $GUI_UNCHECKED)
    GUICtrlSetState($lbPrefixTmp, $GUI_DISABLE)
    GUICtrlSetState($inPrefixTmp, $GUI_DISABLE)
    $fPrefix = False
    EndIf
    If $iCreateVideoFolder = 1 Then
    GUICtrlSetState($rVideoJa, $GUI_CHECKED)
    Else
    GUICtrlSetState($rVideoNein, $GUI_CHECKED)
    EndIf
    _GUICtrlListView_DeleteAllItems($hLVDel)
    Local $a = StringSplit($sDeleteList, ',')
    For $i = 1 To $a[0]
    GUICtrlCreateListViewItem($a[$i], $ListViewDel)
    Next
    EndFunc

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

    Func _LoadListview()
    _GUICtrlListView_DeleteAllItems($hLV)
    Local $aFolderRecursive, $sFilesFound, $sAllFiles = '', $iErr = 0
    If $fSubFolder Then
    GUICtrlSetData($inProgress, 'Unterordner Einlesen [0%]')
    $sAllFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1, '', True)
    If StringLen($sAllFiles) = 1 Then
    $sAllFiles = ''
    Else
    $sAllFiles &= Chr(0)
    EndIf
    $aFolderRecursive = _GetFilesFolder_Rekursiv($sFolder, $sExt, 1, 0)
    If @error Then
    If $sAllFiles <> '' Then
    $aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
    Else
    $iErr = 1
    EndIf
    Else
    $iStep = 100/$aFolderRecursive[0]
    For $i = 1 To $aFolderRecursive[0]
    GUICtrlSetData($progress, $i*$iStep)
    GUICtrlSetData($inProgress, 'Unterordner Einlesen [' & Int($i*$iStep) & '%]')
    $sFilesFound = _Multi_FileListToArray($aFolderRecursive[$i], $sExt, 1, 1, '', True)
    If @error Then
    ContinueLoop
    Else
    $sAllFiles &= $sFilesFound & Chr(0)
    EndIf
    Next
    GUICtrlSetData($progress, 100)
    GUICtrlSetData($inProgress, 'Unterordner Einlesen [100%]')
    If $sAllFiles <> '' Then
    $aFiles = StringSplit(StringTrimRight($sAllFiles, 1), Chr(0))
    EndIf
    EndIf
    Else
    $aFiles = _Multi_FileListToArray($sFolder, $sExt, 1, 1)
    If @error Then $iErr = 1
    EndIf
    If $iErr = 1 Then Return
    _GetCountFiles($aFiles)

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

    GUICtrlSetData($progress, 0)
    GUICtrlSetData($inProgress, 'Datei Info Lesen [0%]')
    Sleep(300)
    Local $sInfo, $sDateTime, $sPath, $sLastPath, $iFolder = 0
    $iStep = 100/$aFiles[0]
    ReDim $aListview[$aFiles[0]][3]
    ReDim $aItemID[$aFiles[0]]
    For $i = 1 To $aFiles[0]
    GUICtrlSetData($progress, $i*$iStep)
    GUICtrlSetData($inProgress, 'Datei Info Lesen [' & Int($i*$iStep) & '%]')
    $sInfo = _ImageGetInfo($aFiles[$i])
    $sDateTime = _ImageGetParam($sInfo, "DateTime")
    If $sDateTime = '' Then
    $sDateTime = FileGetTime($aFiles[$i], 1, 1)
    If $sDateTime = '' Then
    ContinueLoop
    Else
    $sDateTime = StringRegExpReplace($sDateTime, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$1:$2:$3 $4:$5:$6')
    EndIf
    EndIf
    $sPath = StringLeft($aFiles[$i], StringInStr($aFiles[$i], '\', 1, -1) -1)
    If $sPath <> $sLastPath Then
    $sLastPath = $sPath
    $iFolder += 1
    EndIf
    $aListview[$i-1][0] = $iFolder
    $aListview[$i-1][1] = $sDateTime
    $aListview[$i-1][2] = $aFiles[$i]
    Next
    GUICtrlSetData($inProgress, 'Datei Info Lesen [100%]')
    Sleep(500)
    GUICtrlSetData($progress, 0)
    GUICtrlSetData($inProgress, 'Dateien Laden [0%]')
    _ArraySort_2ary($aListview, 0, 0)
    Sleep(300)
    _GUICtrlListView_BeginUpdate($hLV)
    For $i = 0 To UBound($aListview) -1
    GUICtrlSetData($progress, ($i+1)*$iStep)
    GUICtrlSetData($inProgress, 'Dateien Laden [' & Int(($i+1)*$iStep) & '%]')
    $aItemID[$i] = GUICtrlCreateListViewItem($aListview[$i][2] & '|' & $aListview[$i][0] & '|' & $aListview[$i][1], $ListView)
    If StringInStr(FileGetAttrib($aListview[$i][2]), 'R') Then
    GUICtrlSetColor(-1, 0xFF0000) ; == Test auf Schreibschutz
    $sReadOnly &= $i & ' '
    $iCntReadOnly += 1
    Else
    GUICtrlSetColor(-1, 0x00008B)
    EndIf
    Next
    _GUICtrlListView_HideColumn($hLV, 1)
    _GUICtrlListView_EndUpdate($hLV)
    GUICtrlSetData($progress, 100)
    GUICtrlSetData($inProgress, 'Dateien Laden [100%]')
    GUICtrlSetState($cbSelAll, $GUI_CHECKED)
    GUICtrlSetState($btRename, $GUI_ENABLE)
    _CheckAll(True)
    EndFunc

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

    Func _CheckAll($_iState)
    Local $iCount = _GUICtrlListView_GetItemCount($hLV)
    If $iCount = 0 Then Return
    For $i = 0 To $iCount -1
    If _StringInList($sReadOnly, String($i)) Then ContinueLoop
    _GUICtrlListView_SetItemChecked($hLV, $i, $_iState)
    Next
    EndFunc

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

    Func _StringInList($_sStr, $_sSub, $_sDelim=' ', $_iCase=0, $_iPart=0)
    Local $aList = StringSplit($_sStr, $_sDelim, 1)
    For $i = 1 To $aList[0]
    If $_iPart = 1 Then
    If StringInStr($aList[$i], $_sSub, $_iCase) Then Return True
    Else
    If $_iCase = 1 Then
    If $aList[$i] == $_sSub Then Return True
    Else
    If $aList[$i] = $_sSub Then Return True
    EndIf
    EndIf
    Next
    Return False
    EndFunc

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

    Func _GetCountFiles($_a)
    Local $sExt
    For $i = 1 To $_a[0]
    $sExt = StringTrimLeft($_a[$i], StringInStr($_a[$i], '.', 1, -1))
    If StringInStr($sExtPict, $sExt) Then
    $aCountFiles[0] += 1
    ContinueLoop
    EndIf
    If StringInStr($sExtVideo, $sExt) Then $aCountFiles[1] += 1
    Next
    GUICtrlSetData($lbCntPic, $aCountFiles[0])
    GUICtrlSetData($lbCntVid, $aCountFiles[1])
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hLV
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    If $hWndFrom <> $hWndListView Then Return $GUI_RUNDEFMSG
    Switch DllStructGetData($tNMHDR, "Code")
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $iItem = DllStructGetData($tInfo, "Index")
    If $iItem >= 0 Then ShellExecute(_GUICtrlListView_GetItemText($hLV, $iItem))
    Case $NM_RCLICK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $iItem = DllStructGetData($tInfo, "Index")
    If $iItem < 0 Then Return $GUI_RUNDEFMSG
    If StringInStr(FileGetAttrib(_GUICtrlListView_GetItemText($hLV, $iItem)), 'R') Then
    GUICtrlSetState($ConNoRO, $GUI_ENABLE)
    Else
    GUICtrlSetState($ConNoRO, $GUI_DISABLE)
    EndIf
    Local $aMPos = MouseGetPos()
    WinMove($hContext, '', $aMPos[0]-20, $aMPos[1]-70)
    GUISetState(@SW_SHOW, $hContext)
    $fShowContext = True
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _ToolTipMouseExit("text", [time [, x=-1 [, y=-1 [, "title" [, icon [, options]]]]]] )
    ;
    ; Description usual ToolTip, will be terminate with mouse move, latest after time
    ;
    ; Parameter same as used by ToolTip
    ; if x Or y =-1 then ToolTip will be placed at mouse position
    ; optional $TIME default is 3000 ms
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _ToolTipMouseExit($TEXT, $TIME=-1, $x=-1, $y=-1, $TITLE='', $ICON=0, $OPT='')
    If $TIME = -1 Then $TIME = 3000
    Local $start = TimerInit(), $pos0 = MouseGetPos()
    If ($x = -1) Or ($y = -1) Then
    ToolTip($TEXT, $pos0[0], $pos0[1]-15, $TITLE, $ICON, $OPT)
    Else
    ToolTip($TEXT, $x, $y, $TITLE, $ICON, $OPT)
    EndIf
    Do
    Sleep(50)
    $pos = MouseGetPos()
    Until (TimerDiff($start) > $TIME) Or _
    (Abs($pos[0] - $pos0[0]) > 10 Or _
    Abs($pos[1] - $pos0[1]) > 10)
    ToolTip('')
    EndFunc ;==>_ToolTipMouseExit

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Recursive listing of files and/or folders
    ; Parameter(s): $sPath Basicpath of listing ('.' -current path, '..' -parent path)
    ; $sExt Extension for file selection '*' or -1 for all (Default)
    ; $iDir -1 Files+Folder(Default), 0 only Files, 1 only Folder
    ; optional: $iRetType 0 for Array, 1 for String as Return
    ; optional: $sDelim Delimiter for string return
    ; 0 -@CRLF (Default) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Default) or string with found pathes of files and/or folder
    ; Array[0] includes count of found files/folder
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $strFiles = '' Then Return SetError(1,0,0)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

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

    ;===============================================================================
    ; Function Name....: _Multi_FileListToArray
    ; Description......: Dateien und/oder Ordner eines Pfades auflisten, mehrere Wildcards möglich
    ; Parameter(s).....: $_sPath Pfad für Auflistung
    ; .................: $_sFilter Filter für Dateityp(en), Wildcard ist "*" (Standard), mehrere Filter möglich, trennen mit "," z.B. "jpg,jpeg,gif,png,bmp"
    ; .................: $_iFlag 0 (Standard) = Dateien u. Ordner, 1 = nur Dateien, 2 = nur Ordner
    ; .................: $_fFullPath 0 (Standard) = nur Datei/Ordnername, 1 = kpl. Pfad
    ; .......optional..: $_sDirChar Standard "", Zeichen(folge), die einer Ordnerausgabe vorangestellt werden kann (z.B. "[D] ")
    ; .......optional..: $_fStrRet 'False' (Standard), mit 'True' Rückgabe eines Chr(0) getrennten Strings, statt eines Arrays
    ; Return Value(s)..: Erfolg Array mit den Dateien/Ordnern, Anzahl an $a[0]
    ; .................: Fehler 0 @error: 1-Pfad existiert nicht; 2-Filter fehlerhaft; 3-Flag fehlerhaft; 4-nichts gefunden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _Multi_FileListToArray($_sPath, $_sFilter='*', $_iFlag=0, $_fFullPath=0, $_sDirChar='', $_fStrRet=False)
    If Not FileExists($_sPath) Then Return SetError(1,0,0)
    If StringRegExp($_sFilter, '[.;\s]') Then Return SetError(2,0,0)
    If $_iFlag < 0 Or $_iFlag > 2 Then Return SetError(3,0,0)
    If StringRight($_sPath, 1) <> '\' Then $_sPath &= '\'
    Local $fAll = False, $sFiles = '', $aFilter[2] = [1,'*'], $hSearch, $sFound, $aRet, $sSuffix, $sPath = ''
    If $_fFullPath Then $sPath = $_sPath
    If $_sFilter = '*' Then $fAll = True
    If Not $fAll Then $aFilter = StringSplit($_sFilter, ',')
    $hSearch = FileFindFirstFile($_sPath & '*.*')
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    Switch $_iFlag
    Case 0
    If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ; == alle Ordner
    $sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
    Else ; == Dateien Filtern
    If $fAll Then
    $sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
    Else
    For $i = 1 To $aFilter[0] ; == Dateien aus Filter
    $sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
    If $aFilter[$i] = $sSuffix Then
    $sFiles &= $sPath & $sFound & Chr(0)
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    Case 1 ; == Dateien
    If StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
    If $fAll Then
    $sFiles &= $sPath & $sFound & Chr(0) ; == alle Dateien
    Else
    For $i = 1 To $aFilter[0] ; == Dateien aus Filter
    $sSuffix = StringTrimLeft($sFound, StringInStr($sFound, '.', 1, -1))
    If $aFilter[$i] = $sSuffix Then
    $sFiles &= $sPath & $sFound & Chr(0)
    ExitLoop
    EndIf
    Next
    EndIf
    Case 2 ; == Ordner
    If Not StringInStr(FileGetAttrib($_sPath & $sFound), 'D') Then ContinueLoop
    $sFiles &= $_sDirChar & $sPath & $sFound & Chr(0)
    EndSwitch
    WEnd
    If $_fStrRet And $sFiles <> '' Then Return StringTrimRight($sFiles, 1)
    $aRet = StringSplit(StringTrimRight($sFiles, 1), Chr(0))
    If @error Then Return SetError(4,0,0)
    Return $aRet
    EndFunc ;==> _Multi_FileListToArray

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

    ;------------------------------------------------------------------------------------------------------------
    ; Function _ArraySort_2ary(ByRef $ARRAY [, $DIM_1ST=0 [, $DESCENDING=0 [$REVERSE=False]]])
    ;
    ; Description sort an 2D-Array 2-ary
    ; BaseIndex is 0
    ; sort the whole array
    ;
    ; Parameter $ARRAY: Array to sort
    ; optional $DIM_1ST: MainSortIndex; 1st Dim. [0] or last occurence in 2nd Dim.[all other values] (default 0)
    ; optional $DESCENDING: Sort ascending[0]/descending[1] (default 0)
    ; optional $REVERSE: Sort 2nd Dimension reverse to 1st Dimension (default False)
    ;
    ; Return Succes ByRef 2-ary sorted Array
    ; Failure 0 set @error
    ; @error = 1 given array is not array
    ; @error = 2 given array has only 1 dimension
    ;
    ; Requirements By using numeric entry, be sure that type is "number" for correct sort
    ; Works with any occurences in 2nd Dimension
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DESCENDING=0, $REVERSE=False)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    SetError(2)
    Return 0
    EndIf
    If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1
    Local $arTmp[1][$UBound2nd]
    _ArraySort($ARRAY,$DESCENDING,0,0,$DIM_1ST)
    If $REVERSE Then
    Switch $DESCENDING
    Case 0
    $DESCENDING = 1
    Case 1
    $DESCENDING = 0
    EndSwitch
    EndIf
    For $u = 0 To $UBound2nd-1
    For $i = 0 To UBound($ARRAY)-1
    If $sortYES = 0 Then
    If $u > 0 Then
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _
    ( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    Else
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    EndIf
    ElseIf $sortYES = 1 Then
    If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then
    $sortYES = 0
    $LAST = $i +1
    ReDim $arTmp[$LAST-$FIRST][$UBound2nd]
    $tmpFIRST = $FIRST
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l]
    Next
    $tmpFIRST += 1
    Next
    $tmpFIRST = $FIRST
    Switch $DIM_1ST
    Case 0
    If $u = $UBound2nd-1 Then
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1)
    Else
    _ArraySort($arTmp,$DESCENDING,0,0,$u+1)
    EndIf
    For $k = 0 To UBound($arTmp)-1
    For $l = 1 To $UBound2nd-1
    $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
    Next
    $tmpFIRST += 1
    Next
    Case $UBound2nd-1
    If $u = $UBound2nd-1 Then
    _ArraySort($arTmp,$DESCENDING,0,0,0)
    Else
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd-1-$u-1)
    EndIf
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $UBound2nd-2
    $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
    Next
    $tmpFIRST += 1
    Next
    EndSwitch
    EndIf
    EndIf
    Next
    $sortYES = 0
    Next
    EndFunc ;==>_ArraySort_2ary

    [/autoit]

    Hier noch ein paar Bilder:
    [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer01_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer02_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer03_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer04_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer05_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer06_t.gif]
    [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer4_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer5_t.gif] [Blockierte Grafik: http://www.imgbox.de/users/BugFix/thumbnails/renamer6_t.gif]

    DL bisher: 24