Rekursive Dateisuche

  • Hallo,
    kann mir bitte jemand helfen?
    Ich möchte das Skript im Spoiler, hier der Link zum Ursprungsskript: Rekursive Dateisuche gern so verwenden, dass die Dateinamen erhalten bleiben aber Nummern vorgesetzt werden. Die Dateien sollen auch nicht verschoben, sondern im Startordner umbenannt und dann zum Zielordner kopiert werden.
    Freundliche Grüße

    Spoiler anzeigen
    [autoit]

    Local $startPath = 'C:\Test\'
    Local $ZielPfad = 'C:\Test\Kopien\' ; Backslash mit verwenden!
    Local $ext = 'txt'

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

    Local $artxtFiles = _GetFilesFolder_Rekursiv($startPath, $ext, 0)
    Local $len = StringLen(String($artxtFiles[0]))
    Local $nul = ''
    If $len > 1 Then
    For $i = 1 To $len - 1
    $nul &= '0'
    Next
    EndIf

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

    For $i = 1 To $artxtFiles[0]
    FileCopy($artxtFiles[$i], $ZielPfad & StringRight($nul & $i, $len) & '.txt')
    If @error Then
    MsgBox(262160, "ACHTUNG", "Die Datei" & @CRLF & $artxtFiles[$i] & @CRLF & _
    "konnte nicht verschoben werden, da eine Zieldatei mit dem Namen" & @CRLF & _
    $ZielPfad & StringRight($nul & $i, $len) & '.jpg' & @CRLF & "bereits existiert!")
    EndIf
    Next
    ;MsgBox(262176, "FERTIG", "Verschieben und Umbenennen der Dateien beendet.")

    [/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 $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 ;==>_GetFilesFolder_Rekursiv

    [/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 ;==>_ShowSubFolders

    [/autoit]
  • Umbenennen ist doch auch nur ein verschieben innerhalb eines Ordners ;)
    Ich denke du willst es so in etwa:

    Spoiler anzeigen
    [autoit]

    Local $startPath = 'C:\Test\'
    Local $ZielPfad = 'C:\Test2\' ; Zielordner darf nicht unterhalb der Struktur des Quellordners liegen, ansonsten wären Anpassungen nötig
    Local $ext = 'txt'
    Local $sNummer = '001_'
    Local $sDateiUmbenannt, $sArchiv

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

    Local $artxtFiles = _GetFilesFolder_Rekursiv($startPath, $ext, 0)
    For $i = 1 To $artxtFiles[0]
    $sDateiUmbenannt = StringReplace($artxtFiles[$i], "", "" & $sNummer, -1)
    FileMove($artxtFiles[$i], $sDateiUmbenannt)
    $sArchiv = $ZielPfad & StringTrimLeft($sDateiUmbenannt, StringInStr($sDateiUmbenannt, "", 0, -1))
    FileCopy($sDateiUmbenannt, $sArchiv)
    If @error Then
    MsgBox(262160, "ACHTUNG", "Die Datei" & @CRLF & $artxtFiles[$i] & @CRLF & _
    "konnte nicht verschoben werden, da eine Zieldatei mit dem Namen" & @CRLF & _
    $sArchiv & @CRLF & "bereits existiert!")
    EndIf
    Next

    [/autoit]
  • Hallo Schnitzel,
    danke für den Hinweis was das Umbenennen betrifft - das hatte ich mir schon gedacht. Ich war mir nur nicht sicher.
    Leider passiert gar nichts, wenn ich das Skript starte.
    Eigentlich läut das Skript von Bugfix, Rekursive Dateisuche, das ich für meinen Zweck verändert (oder vermurkst) habe, schon ein bisschen. Die Dateien werden umbenannt und in den gewünschten Ordner kopiert. Nur leider werden die Namen der Dateien von z.B. "aaa.txt" in "01.txt" geändert. Die alten Dateinamen sollen aber nur so verändert werden, dass Nummern vorgesetzt werden, so also: "01aaa.txt".

    Danke auch für die Hilfe in dem anderen thread. Das muß ich mir noch ansehen.
    Freundliche Grüße

  • Leider passiert gar nichts, wenn ich das Skript starte.


    Bekommst du irgendwelche Fehler oder passiert einfach nichts?
    Hast du schonmal versucht dir zwischendurch ausgeben zu lassen was gerade abgearbeitet wird?
    Mit ein bisschen debugging solltest du egtl schnell rausbekommen wo das Problem liegt...

  • wenn es nur das richtige durchnummerieren ist

    Achtung! bin grade an nem Rechner ohne AutoIt und kann den code nicht testen ^^

    Spoiler anzeigen
    [autoit]


    Local $startPath = 'C:\Test\'
    Local $ZielPfad = 'C:\Test\Kopien\' ; Backslash mit verwenden!
    Local $ext = 'txt'

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

    Local $artxtFiles = _GetFilesFolder_Rekursiv($startPath, $ext, 0)
    Local $j = 1, $k = 0, $l = 0

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

    For $i = 1 To $artxtFiles[0]
    Local $tmp = StringSplit($artxtFiles[$i], '\')
    if isArray($tmp) Then $tmp = $tmp[$tmp[0]]
    FileCopy($artxtFiles[$i], $ZielPfad & $l & $k & $j & "_" & $tmp & $ext)
    If @error Then
    MsgBox(262160, "ACHTUNG", "Die Datei" & @CRLF & $artxtFiles[$i] & @CRLF & _
    "konnte nicht verschoben werden, da eine Zieldatei mit dem Namen" & @CRLF & _
    $ZielPfad & StringRight($nul & $i, $len) & '.jpg' & @CRLF & "bereits existiert!")
    Else
    $j += 1
    if $j > 9 Then
    $j = 0
    $k += 1
    Endif
    if $k > 9 Then
    $k = 0
    $l += 1
    Endif
    Endif
    Next

    [/autoit]

    ist jetzt zwar sehr unelegant aber ich hoffe das war das problem was du meintest