Recursiv Verzeichnisse und Dateien umbenennen

  • Hallo

    mit folgendem Beispielcode ist es möglich, bis zu sechs verschiedene Zeichenersetzungen, in Datei- und Verzeichnisnamen recursiv vorzunehmen.

    Versuche ich beispielsweise 10 verschiedene Zeichenersetzungen, bekomme ich einen Fehler:

    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    If BitAND($aFilesFolder[$i][7], $FILE_ATTRIBUTE_DIRECTORY) Then _RenameRecursive($sPath & $aFilesFolder[$i][0])

    If BitAND(^ ERROR

    Warum das ganze:

    Es dürfen nur Buchstaben, Zahlen, Binde- und Unterstrich in meinenDatei- und Verzeichnisnamen zugelassen werden. Alle anderen Zeichen müssen aus bestimmten Gründen aus den Verzeichnis und Dateinamen entfernt werden.

    Jetzt sollte ich aber bis zu (geschätzten) 30 Varianten für verschiedene Zeichenersetzungen, in Datei- und Verzeichnisnamen recursiv vorzunehmen können.

    Würdet Ihr mir bitte das eine oder andere Beispiel nennen, wie Ihr das Vorhaben am sinnvollsten umsetzen würdet?

  • Zuerst das Wichtigste: _WinAPI_EnumFiles unterschlägt definitiv Files und womöglich auch Folders, denn es sind bei meinem Test 6 Einträge weniger im Array, als mit _FileListToArrayRec! Der Sache werde ich aber noch nachgehen.

    If BitAND($aFilesFolder[$i][7], $FILE_ATTRIBUTE_DIRECTORY) Then _RenameRecursive($sPath & $aFilesFolder[$i][0])

    If BitAND(^ ERROR

    Der erste Index in einem Array fängt immer bei 0 an. Wenn das Array also 7 Spalten hat, gehen diese von 0 - 6!

    In der AutoIt-Hilfe zu _WinAPI_EnumFiles steht es sogar drin:

    Code
    ; a 2D array containing the following information:
    ; [0][0] - Number of rows in array (n)
    ; [0][i] - Unused
    ; [n][0] - The name of the file.
    ; [n][1] - The time (UTC) when the file was created.
    ; [n][2] - The time (UTC) when the file was last accessed.
    ; [n][3] - The time (UTC) when the file was last changed.
    ; [n][4] - The size of the file, in bytes.
    ; [n][5] - The allocation size of the file, in bytes.
    ; [n][6] - The file attributes ($FILE_ATTRIBUTE_*). <<<=== <<<=== <<<===

    Deine obige Zeile müsste ergo so aussehen:

    AutoIt
    If BitAND($aFilesFolder[$i][6], $FILE_ATTRIBUTE_DIRECTORY) Then _RenameRecursive($sPath & $aFilesFolder[$i][0])

    Bei Verwendung von _FileListToArrayRec nimmst du dann anstelle von

    If BitAND($aFilesFolder[$i][6], $FILE_ATTRIBUTE_DIRECTORY) Then ...

    If StringRight($aFilesFolder[$i], 1) = '\' Then ...

    Und was Geschwindigkeit angeht, ist _FileListToArrayRec sogar noch ein wenig schneller!

    Code
    ; _WinAPI_EnumFiles      ==>> Files + Folders = 47, Time = 14.2644, [n][1] - [n][6] brauchst du doch gar nicht?!
    ; _FileListToArrayRec    ==>> Files + Folders = 53, Time =  8.5151, $FLTAR_SORT, $FLTAR_FULLPATH
    ; _FileListToArrayRec    ==>> Files + Folders = 53, Time = 10.7491, $FLTAR_SORT, $FLTAR_NOPATH

    Jetzt sollte ich aber bis zu (geschätzten) 30 Varianten für verschiedene Zeichenersetzungen, in Datei- und Verzeichnisnamen recursiv vorzunehmen können.

    Oh, was ein lecker Deutsch... 8o

    Ja, es soll also dynamisch werden... dann solltest du keine fixen Werte nehmen, sondern die Zeichen für jede Variante in ein Input-Control eingeben, diese dann auslesen und in einer Datei (*.ini) speichern. Beim Start lädst du dann diese Ini-Datei, in der du dir dann auch merkst, welches Tabelle beim letzten Start aktiv war. Eine würde ich zumindest als Default speichern, dann hast du auch direkt schon etwas Futter für die Haie.

    Ich habe das in einigen meiner Projekte etwa so gelöst:

    Code: LPS_Manager.ini
    [UDP]
    # Pattern|Replace¦Pattern|Replace¦...
    LastUsedTable=ConversionTable_02
    TableSeparator="¦" # Chr(166)
    ConversionTable_01=ä|ä¦Ã„|Ħö|ö¦Ã–|֦ü|ü¦Ãœ|ܦß|ß
    ConversionTable_02=ä|ae¦ö|oe¦ü|ue¦ |_¦ß|ss
    ConversionTable_03=Reiner|Rainer¦Neustatt|Neustadt¦Marwel|Marvel¦Mar Wel|Marvel

    Die ConversionTables lade ich mir dann alle als Array in ein Array... ändert der User den Index für die aktuelle Tabelle, kopiere ich das benötigte Table-Array aus $g_aConversionTables[n] nach $g_aCurrentConversionTable.

    AutoIt
    $g_iCurrentConversionTable += 1
    If $g_iCurrentConversionTable < Ubound($g_aConversionTables) Then
        $g_aCurrentConversionTable = $g_aConversionTables[$g_iCurrentConversionTable]
    Else
        $g_iCurrentConversionTable -= 1
    EndIf

  • Der erste Index in einem Array fängt immer bei 0 an. Wenn das Array also 7 Spalten hat, gehen diese von 0 - 6!

    In der AutoIt-Hilfe zu _WinAPI_EnumFiles steht es sogar drin:

    Hallo

    und danke erstmal für die ausführliche Antwort.

    Ich habe mich schlecht ausgedrückt. Sorry.

    In meinem Beispiel-Code mit der Animation funktioniert das umbenennen der Dateinamen sehr gut.

    Das mit der Zahl 7 war nur ein Beispiel dafür, dass ab [$i][7] der nachfolgende Fehler auftritt.

    If BitAND(^ ERROR Du hast ja aber erklärt warum. Hatte das nicht berücksichtigt.

    Ich habe das in einigen meiner Projekte etwa so gelöst: Code: LPS_Manager.ini

    Das ganze Vorhaben mit einer .ini oder. txt umzusetzen wäre mir auch viel lieber.

    Die ConversionTables lade ich mir dann alle als Array in ein Array... ändert der User den Index für die aktuelle Tabelle, kopiere ich das benötigte Table-Array aus $g_aConversionTables[n] nach $g_aCurrentConversionTable.

    Vielen Dank für Deine sehr guten Lösungsansatz.

    Es wird für mich aber ohne weitere Hilfe, zu meinem geposteteten Code, wahrscheinlich nicht umsetzbar werden.

    Aber das eigentliche Problem das ich mit dem Array hatte, hast Du ja bereits gelöst.

    Zuerst das Wichtigste: _WinAPI_EnumFiles unterschlägt definitiv Files und womöglich auch Folders, denn es sind bei meinem Test 6 Einträge weniger im Array, als mit _FileListToArrayRec!

    Das hatt ich auch schon am Rande in mehreren Verzeichnissen bemerkt. Die Recursion funktioniert irgendwie nicht richtig.

    _FileListToArrayRec! : Schaue ich mir gleich mal an.

    Vielen Dank für den Hinweis. :thumbup: