Ordner richtig verschieben?

  • Hallo zusammen,

    hab jetzt folgendes Problem:

    Ich entpacke eine Datei, die immer zwei Ordner enthält.
    Diese Ordner haben immer die selben namen (O1 und O2).
    Diese beiden Ordner muss ich nun in einen anderen Ordner namens Sendback verschieben.
    Mit DirMove verschiebe ich allerdings nur die Unterordner von 01 und 02 und nicht die
    Ordner selber. Ich benötige aber folgende Struktur:
    sendback\01 und sendback\02

    Also dachte ich mir, einfach die Unterordner 01 und 02 im Sendback Verzeichnis manuell anzulegen,
    sodass es ausreicht, wenn DirMove nur die Unterordner verschiebt.

    Dabei hat sich ein neues Problem ergeben.
    Wenn das Overwrite-Flag bei DirMove gesetzt ist, erstellt AutoIT folgende Struktur:
    sendback\01\01 und sendback\02\02, was ich wiederum nicht gebrauchen kann.

    Ist aber laut AutoIT Doku auch so gewollt:

    Code
    If the destination already exists and the overwrite flag is specified then the source directory will be moved inside the destination.


    Ist das Flag nicht gesetzt, verschiebt er die Dateien überhaupt nicht, da gleichnamige Ordner bereits vorhanden sind..
    Ich hoffe, es ist nicht zu umständlich ausgedrückt ^^

    Einmal editiert, zuletzt von Davor (17. Januar 2008 um 13:34)

  • Das wäre suboptimal, da die beiden Ordner stetig gefüllt werden sollen
    und ich den Inhalt später noch brauche.

  • das geht auch nicht.
    es muss sicher gestellt sein, dass der Ordner 01 zuerst im sendback verzeichnis landet, da
    der Ordner 02 ein anderes Programm anstöst, welches wiederum die Dateien in 01 verarbeitet 8|

  • Das geht nicht, da das andere Programm nicht von mir ist
    und nur auf eine bestimmte datei reagiert...

  • Also im Ordner 01 können sowohl Dateien als auch Unterordner sein (immer unterschiedlich)
    und im Ordner 02 sind nur Dateien.
    Die vorhandenen sollten optimaler weise nicht überschrieben werden.
    D.h. das die Ordner 01 und 02 täglich mit neuen Dateien/Ordnern gefüllt werden. Diese sollen aber nicht verloren gehen.

    • Offizieller Beitrag

    OK, dann probiers mal hiermit.
    Es wird erst die Ordnerstruktur der Quelle ermittelt (rekursiv) und diese dann OHNE Überschreiben bestehender Ordner auf das Ziel übertragen.
    Anschließend werden alle Dateien der Quelle ermittelt (rekursiv) und in die zugehörigen Ordner des Ziels verschoben.
    Wie gewollt, kein Überschreiben.

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    $ZipPfad = 'C:\...\' ; entpackte Ordner
    $quelle1 = $ZipPfad & '01'
    $quelle2 = $ZipPfad & '02'
    ; Ordnerstruktur Quelle ermitteln, dadrin dürfen NUR '01' und '02' mit Unterordnern/Dateien sein!!
    $arQuellOrdner = _GetFileList($ZipPfad, '*.*', 1)

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

    $ziel = 'C:\..\sendback\'
    ; Ordnerstruktur auf Ziel übertragen
    ; zuvor ZipPfad-Anteil abschneiden
    For $i = 1 To UBound($arQuellOrdner) -1
    $arQuellOrdner[$i] = StringReplace($arQuellOrdner[$i], $ZipPfad, '')
    If Not FileExists($ziel & $arQuellOrdner[$i] & '\') Then DirCreate($ziel & $arQuellOrdner[$i])
    Next

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

    ; alle Quelldateien ermitteln
    $arQuellDateien = _GetFileList($ZipPfad, '*.*')

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

    ; Dateien verschieben
    For $i = 1 To UBound($arQuellDateien) -1
    FileMove($arQuellDateien[$i], $ziel & StringReplace($arQuellDateien[$i], $ZipPfad, ''))
    Next

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

    ; Function: _GetFileList()
    ; Author: jos van der Zande
    ; Einbindung des $DIR_ONLY-Flag von BugFix
    Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
    Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $T_MASK = "n" Then $T_MASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    Wend
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    Wend
    FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES,1)
    $N_OFILE = StringSplit($T_FILENAMES,@CR)
    Return( $N_OFILE )
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

    [/autoit]

    EDIT: So, hatte vergessen, den Zip-Pfadanteil der Quelle zu entfernen. Korrigiert.

  • Lol das ja länger als mein ganzes Skript :S
    Ich schau mir das später auf jeden fall an, danke erstmal..

  • So,

    danke dir BugFix, aber ich
    konnte es iwie nicht einrichten.
    Wie gesagt, bin noch Anfänger, was AutoIT betrifft.

    Ich habs jetzt mit _RunDos und xcopy gemacht.