Wiederherstellung einer Verzeichnisstruktur

  • Hallo allerseits,

    Habe folgedes Problem mit einem abgewandelten Skript von Oskar u. Micha_he.

    Das Skript hat folgende Funktion:

    1. Eingabe eines Startpfades
    2. Eingabe eines Zielverzeichnisses
    3. Verschieben aller Datein ab einem bestimmten Datums (rekursiv) in das Zielverzeichnis. Löschen eines leeren Verzeichnisses im Startpfad.

    Soweit so gut. Funktioniert so ziemlich alles tadellos. Es wird alles wunschgemäß in das Zielverzeichnis kopiert NUR: es erfolgt keine Rekonstruktion der Ursprungverzeichnisse. Es wird lediglich das eingegebene Zielverzeichnis erstellt und dort hinein alle Dateien verschoben.


    Es handelt sich dabei um die Zeile 105 im unten angeführten Skript. Was mache ich falsch, dass beim FileMove die Verzeichnisstruktur nicht reproduziert wird?

    Viele Dank für eure Hilfe.


    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <Array.au3>
    #include <File.au3>
    $Server=Inputbox("Eingabe des Startverzeichnisses","Verzeichnis")
    MsgBox(1,"Startverzeichnis",$Server)
    global $sZiel=Inputbox("Eingabe des Zielverzeichnisses","Verzeichnis")
    If StringRight($sZiel, 1) <> '\' Then $sZiel &= '\'
    MsgBox(1,"Zielverzeichnis",$sZiel)

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

    $s_MoveDatum=InputBox("Eingabe des Datums, ab dem verschoben werden soll","Datum (YYYYMMDD)")
    $s_Datum=StringRegExpReplace($s_MoveDatum,'(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    $Now=StringRegExpReplace(_NowCalc(),'(\d{4})(\d{2})(\d{2})(.*)', '$3/$1/$2')
    $Tage=_DateDiff('D',$s_Datum,$Now)
    MsgBox(1,"",$Tage)
    $Filter=("*") ; Angabe der Fileendungen ohne * davor und mit | getrennt
    $Test= _FileMoveDate($Server,$Tage,True,True,True,False,$Filter)
    ; ==============================================================================
    ; Parameterangaben in der Reihenfolge ihres Auftretens
    ; ------------------------------------------------------------------------------
    ; $Server = Angabe des Verzeichnisses
    ; $Tage = Angebe des Filealters, nachdem gelöscht wird
    ; True = Auch Files mit Read-Only werden gelöscht
    ; True = Auch Files in Unterverzeichnissen werden gelöscht
    ; False = Leere Unterverzeichnisse werden nicht gelöscht
    ; True = Eine Log-Ausgabe über die Konsole
    ; $Filter = Angabe der Fileendungen, die zu löschen sind
    ; ==============================================================================
    ;=================================================================================================================================================
    ; Funktionsname: _FileMoveDate($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog], [$sFilter])
    ; ------------------------------------------------------------------------------------------------------------------------------------------------
    ; Beschreibung: löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv) nach einer angegebenen Anzahl von Tagen
    ; Parameter(s): $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
    ; $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
    ; $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht, die gegen löschen geschützt sind ("R"-Attribut)
    ; $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unterverzeichnisse) durchsucht.
    ; $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn es (aufgrund der Löschaktion) leer ist.
    ; $bLog = wenn "True" wird das Ergebnis der Löschaktion in die Console geschrieben.
    ; $sFilter = hier können Dateierweiterungen (mit | getrennt) gegeben werden für welche die Löschaktion gilt *=alle
    ; #include <Date.au3>
    ; Rückgabewerte: bei Erfolg Rückgabe = 1
    ; Verzeichnis existiert nicht Rückgabe = 2
    ; Verzeichnis ist leer Rückgabe = 3
    ; bei Löschfehlern Rückgabe = 0
    ; und @error:
    ; 1 = $iDays ist keine oder eine negative Zahl
    ; Autoren: Oscar (http://www.autoit.de)
    ; Micha_he (http://www.autoit.de)
    ; Angepasst: autoBert um $sFilter erweitert
    ; Stefan Krismer erweitert um Verzeichnisprüfung - 04.04.2013
    ; Beispiel: _FileMoveDate('Verzeichnis', Tage, True, True, False, True, Filter (txt|bak|usw - immer getrennt durch | und ohne " ")
    ;==================================================================================================================================================
    Func _FileMoveDate($sPath, $iDays, $bForceDel = False, $bRek = True, $bDirDel = False, $bLog = True, $sFilter = "*")
    Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet,$Return
    Local $aFilter = StringSplit($sFilter, "|")
    If @error Then
    $aFilter[0] = $sFilter
    _ArrayDelete($aFilter,1)
    Else
    _ArrayDelete($aFilter,0)
    EndIf
    If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0) ; Prüfung, ob $iDays eine Zahl die >0 ist
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    $iLeer = DirGetSize($sPath) ; Prüfung, ob Verzeichnis leer ist
    if $iLeer = 0 Then
    Return 3
    endif
    If $hSearch=-1 Then ; Prüfung, ob das Verzeichnis existiert
    Return 2
    EndIf
    If @error Then Return SetError(2, 0, 0)
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    If $bRek Then
    _FileMoveDate($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog, $sFilter)
    If $bDirDel Then
    $hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
    If @error Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = DirRemove($sPath & $sFile)
    If $bLog Then ConsoleWrite('Delete Folder "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    FileClose($hEmpty)
    EndIf
    EndIf
    Else
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) >= $iDays Then
    $aExt = StringSplit($sPath & $sFile, ".")
    If $aFilter[0] = "*" Then
    $bDel=True
    Else
    $bDel = False
    For $i = 0 To UBound($aFilter) - 1
    If $aExt[$aExt[0]] = $aFilter[$i] Then
    $bDel = True
    ExitLoop
    EndIf
    Next
    EndIf
    If $bDel Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = FileMove($sPath & $sFile,$sZiel,9)
    If $bLog Then ConsoleWrite('Move File "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    EndIf
    EndIf
    WEnd
    FileClose($hSearch)
    Return 1
    EndFunc

    [/autoit]
  • Es wird lediglich das eingegebene Zielverzeichnis erstellt und dort hinein alle Dateien verschoben.


    Das ist genau das was die Funktion macht. Vom Anlegen der Ordnerstruktur im Zielverzeichnis war nie die Rede ^^