DirMove - FileMove etc.

  • Hallo Leute!

    Ich habe über die Suche folgendes Thema gefunden: Den Inhalt zweier Ordner Vergleichen

    Soweit so gut dachte ich mir^^ nur dann will man es ja nach seinen Bedürfnissen umbasteln.
    Das Script soll eigentlich folgendes machen:

    Dateien quasi umsortieren
    (dabei kommt es vor, dass in dem $DirStart-Ordner Unterordner sind (z.B. 201001, 201002 etc). Diese "Katergorien" will ich aber garnicht haben, aber den Inhalt des Ordners 201001.
    demnach können in dem Ordner 201001 dann wiederum weitere Ordner sein (01, 02, 03 usw.), in denen dann wiederum die Dateien liegen.

    Nun hapert es bei mir jedoch daran, dass mein Script dann im $Dir_Ziel dann die Oberkategorie "201001" erzeugt. Das soll es aber ja nicht, sondern nur den "01-Ordner" samt Inhalt rüberschubsen (DirMove) damit der 01-Ordner nicht mehr in $Dir_Start" liegt und wenn ein Ordner mit dem 01-Ordner schon existiert dann einfach nur die Datei in den jeweiligen Ordner rüberschubst (FileMove).

    Joah, ich hoffe mal ihr habt wie immer super gute mega scharfte Ratschläge die mich zum Ziel bringen ;) denn irgendwie habe ich nur noch ?( über der Birne

    [autoit]

    $DirZiel = "\\Fileserver\"
    $DirStart = "\\Cluster\"

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

    _unterordner ($DirZiel, $DirStart)

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

    Func _unterordner ($DirZiel, $DirStart)

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

    $search = FileFindFirstFile($DirStart & "*.*")
    While True

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

    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ConsoleWrite($DirStart & $file)
    Exit
    $attrib = FileGetAttrib($DirStart & $file)

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

    ;
    If StringInStr($attrib, "D") Then

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

    if FileExists($DirZiel & $file & "\")==0 Then
    DirCreate($DirZiel & $file & "\")
    EndIf

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

    _unterordner ($DirZiel & $file & "\", $DirStart & $file & "\")

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

    ElseIf FileExists($DirZiel & $file)==0 or FileGetTime($DirStart & $file, 0,1) <> FileGetTime($DirZiel & $file, 0,1) Then
    FileMove($DirStart & $file, $DirZiel, 9)
    ;~ DirRemove($DirStart & $file, 1)
    EndIf
    WEnd
    FileClose($search)

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

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Volumeman (18. August 2010 um 09:16)

  • Hi Volumeman!

    Ich frage mich warum du in Zeile 14 ein Exit stellst o. bei FileExists u. DirCreate ein abschliessendes "\" setzt ???
    Wenn du "\" setzt was ist denn hinterm \.........? okay! so Arbeitet auch deine Funktion zB. C:\Programme\.....<--- und weiter fragt sich die Funktion und macht nichts!

    Ich habe dein Beispiel angepast: ;)

    Spoiler anzeigen
    [autoit]

    Func _unterordner($DirZiel, $DirStart)
    $search = FileFindFirstFile($DirStart & '*')
    While True
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($DirStart & $file), 'D') Then
    If Not FileExists($DirZiel & $file) Then
    DirCreate($DirZiel & $file)
    ConsoleWrite('Ordner wurde Erstellt !! ' & @CRLF)
    EndIf
    _unterordner($DirZiel & $file & '\', $DirStart & $file & '\')
    ElseIf Not FileExists($DirZiel & $file) Or FileGetTime($DirStart & $file, 0, 1) <> FileGetTime($DirZiel & $file, 0, 1) Then
    FileMove($DirStart & $file, $DirZiel, 9)
    ConsoleWrite('Datei wurde Verschoben !! ' & @CRLF)
    EndIf
    WEnd
    FileClose($search)
    EndFunc ;==>_unterordner

    [/autoit]


    LG Kleiner

  • Hallo Kleiner!

    Ja stimmt, mein Fehler... habe Testweise da dieses ConsoleWrite reingesetzt um zu sehen ob der Pfad passt und das Script direkt mit Exit abgebrochen... aber vergessen es hier beim posten rauszukommentieren...

    Nun aber zur Sache ^^

    Das Script an sich funktioniert ja schonmal gut... ABER da gibt es ein Problem mit den Ordnern^^
    Der "Start-Ordner" ist ja "$DirStart = "\\Cluster\" und in diesem Ordner gibt ja die "Unterordner" 201001 und in diesem Ordner wiederum dann einen Ordner 01 und in dem ist die eigentlich Datei.
    Dabei wird der Ordner 201001 auf "$DirZiel = "\\Fileserver\" nicht benötigt sondern lediglich der Ordner 01 samt Inhalt.

    Bild im Anhang als veranschaulichung

    Schönen Sonntag noch!

  • Hi Volumeman!


    Ich finde die Logik nicht die dahintersteckt, mein gedake deine aussage du hast mehrere Ordner die zB. 201001 darin stecken weitere Ordner zB. 01;02;03
    und die möchtest du Verschieben - kopieren wenn noch nicht Existirt oder das Datum sich verändert hat, NUN das GROßE ABER, du lest alles im Ordner Fileserver überprüfen nur wenn da schon Ordner 01 ist dann wird nur das Datum überprüft und gegebenfals ersetzt, also heist das für mich, egal welchen Order du von 201001 o. 201002 o. 201002 durchläust am ende ist es der Letzte Oder in \\Cluster\ den du unter \\Fileserver\ speichers - Vergleichst.

    Ist das so Gewolt oder habe ich da was nicht verstanden?

    LG Kleiner

  • Hallo Kleiner,

    also im wie du schon sagtest... der "letzte" Ordner soll kopiert werden samt Inhalt.
    Der Abgleich mit dem Datum ist dabei eigentlich unwichtig und könnte sogar weg gelassen werden.

    Wichtig ist halt nur:
    Gucken ob im "$DirStart = \\Cluster\" Ordner sind... (Das wären dann die 201001). Wenn der Ordner 201001 da ist, soll das Script nachschauen ob wiederum Ordner drin sind (z.B 01). Wenn ja diese dann auf "$DirZiel = \\Fileserver\" samt Inhalt verschieben.

    Das Script wie du es jetzt umgeschrieben hast, würde dann auf "$DirZiel = "\\Fileserver\" den Ordner 201001 mit anlegen und rekursiv alle weiteren im Ordner 201001 (also \\filserver\201001\01\Dateinname.txt) mitanlegen.
    Was ich allerdings nicht möchte, sondern das Script soll nur der Ordner 01 anlegen inklusive darin liegender Dateien, wenn er nicht auf "$DirZiel = "\\Fileserver\" existiert und sollte der Ordner 01 schon existieren, dann halt einfach nur den Inhalt von "\\Cluster\201001\01\" in den Ordner \\filserver\201001\01 ablegen.

    Hoffe das war klar genug?!
    Hoffe auf Antworten

  • Hi!

    Dann würde ich vorschlagen das du den \\Cluster\201001 Oder prüfst ob er da ist!

    Spoiler anzeigen
    [autoit]

    $DirStart = 'D:\Test\Test_2\Test_3\'

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

    $DirZiel = 'D:\Save\'

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

    If FileExists($DirStart) Then _unterordner($DirZiel, $DirStart)

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

    Func _unterordner($DirZiel, $DirStart)
    $search = FileFindFirstFile($DirStart & '*')
    While True
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($DirStart & $file), 'D') Then
    If Not FileExists($DirZiel & $file) Then
    DirCreate($DirZiel & $file)
    ConsoleWrite('Ordner wurde Erstellt !! ' & @CRLF)
    EndIf
    _unterordner($DirZiel & $file & '\', $DirStart & $file & '\')
    ElseIf Not FileExists($DirZiel & $file) Or FileGetTime($DirStart & $file, 0, 1) <> FileGetTime($DirZiel & $file, 0, 1) Then
    FileMove($DirStart & $file, $DirZiel, 9)
    ConsoleWrite('Datei wurde Verschoben !! ' & @CRLF)
    EndIf
    WEnd
    FileClose($search)
    EndFunc ;==>_unterordner

    [/autoit]

    LG Kleiner

  • Hmmm so müsste ich aber jeden Pfad einzeln eintragen...
    wäre ja besser, wenn ich ihm einen Oberpfad mitgeben könnte und er würde einfach nur quasi den ersten Ordner "vergessen".

    Ich glaube ich habe ein passendes Beispiel-Scenario gefunden, was meine Problematik voll und ganz trifft.

    Man hat eine Musiksammlung. Die Musiksammlung ist Ordner-Technisch aufgestellt in:

    c:\Genre\Interpret\Interpret - Titel.mp3
    (F:\Pop\Volumeman\Volumeman - Testtitel.mp3)

    Mein Script müsste jetzt quasi das Genre überspringen und dann einfach nur den Ordner Interpret anlegen, wenn dieser nicht existiert und den Inhalt rüberschubsen. Sollte der Ordner Interpret schon existieren dann einfach die Datei in den jeweiligen Interpret-Ordner verschieben. Es kommt natürlich vor, dass es mehrere Genres gibt wie Rock usw. usw. in der das Script aber genauso suchen müsste.

    Das Beispiel finde ich sogar noch besser, trifft ziemlich genau die Problematik die ich zur Zeit zu lösen habe hier in der Firma außer dass es sich nicht um eine Musiksammlung geht.

  • Hmmm also ich habe es nochmal etwas geändert...
    wie gesagt... er nimmt den Oberordner weiterhin mit... was er ja nicht soll... schau dir nochmal den Beitrag 7 von mir an... bezüglich des Musik-Verzechniss sortierens...
    das "Genre" in dem Fall müsste/soll er ja überspringen und lediglich IM Genre Ordner nach Unterordnern (\Interpreten-Ordner\Titel.mp3) suchen und den dann verschieben... dabei aber NICHT den Genre-Ordner ansich sondern nur den Inhalt des Genre-Ordners.

    Nochmal zur Verdeutlichung:

    Hauptpfad: d:\Testordner\
    Im Hauptpfad wären dann Ordner z.B \Pop\Interpret\Interpret - Titel.mp3
    \Rock\Interpret\Interpret - Titel.mp3
    \Electronic\Interpret\Interpret - Titel.mp3
    Ziel: e:\Daten\Interpret\Interpret - Titel.mp3

    Die Musik-Sammlungs-geschichte hier ist nur ein Beispiel um es zu verdeutlichen wie ich es benötige... der eigentlich Ordnerinhalt besteht aus .txt dateien

    Hoffe auf weitere Antworten

  • Hi!

    Wenn du nicht weist wie die Struktur heist dann ist es schwer fast unmöglich ich würde sogar sagen unmöglich, den wenn das Algo nicht weiss was es machen soll macht es halt nicht!
    Bedeutung: Mit viel viel aufwand kann man ein Algo Progen das soviel Faktoren berücksichtigt das es einen erlaubt dein wunsch von dir zu schaffen, also auf ein fremden system ohne zu wissen welche Verzeichnisse wo liegen!

    Was würdes du machen wenn man dich in ein Labyrinth steckt ohne logisches denken und Orientierung ... na ... na ... nichts weil du nicht weiss was du machen sollst. ;)

    Ich würde sagen wenn die Rechner in der Firma immer die gleichen namen nutzen ist dann übergebe der Funktionen hilfsmittel um arbeiten zu können.

    LG Kleiner

  • Hallo Kleiner!

    Ich habe ja nicht umsonst einen Screenshot angehängt, der dir verdeutlichen sollte, wie die Beschaffenheit der Verzeichnisse sind.
    Desweiteren dachte ich, dass meine Problematik klar und verständlich sei... bis auf die wechselenden Pfade, die aber einfach nur als "vereinfachung" gelten, damit man besser testen kann.

    Ich hoffe nach deiner Standpauke kommt wieder ein konstruktiver Vorschlag, da Post 9 wohl offen legt, welche Dateien und Ordner wo liegen. ?(

  • Hi!

    Kennst du denn die (alle) Ordner ?

    Wenn nicht versuch diese Funktion einzubauen!

    [autoit]

    Func UebergeordnetenOrdner($Path_uo_Datei)
    ;Ausgabe: Übergeordneten Ordner
    Local $FileUeO = ObjCreate('Scripting.FileSystemObject')
    If @error Then Return SetError(1, 1, -1)
    Return $FileUeO.GetParentFolderName($Path_uo_Datei)
    EndFunc ;==>UebergeordnetenOrdner

    [/autoit]

    So kannst du auch zurück springen ohne zu wissen wie das verzeichniss heist!

    Poste doch mal deine Versuche, wenn dann müssen wir hir auch gemeinsam das anligen lösen!

    LG Kleiner

  • Hi,

    rein theoretisch könnte es so funktionieren, wenn ich es richtig verstanden habe ... (ungetestet) ;)
    Ich hoffe es sind nicht zu grobe Patzer drinnen

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $DirZiel = "\\Fileserver"
    $DirStart = "\\Cluster"

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

    _unterordner ($DirZiel, $DirStart)

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

    Func _unterordner ($DirZiel, $DirStart)

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

    Local $search, $file, $iSize, $aFiles[1]

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

    $search = FileFindFirstFile($DirStart & "\*.*")

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

    If ($search == -1) Then _ ; Keine Dateien gefunden.
    Return $aFiles

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

    While (TRUE)

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

    $file = FileFindNextFile($search)

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

    If (@error) Then _ ; Keine weiteren Dateien gefunden.
    ExitLoop

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

    If (StringInStr(FileGetAttrib($DirStart & '\' & $file), 'D')) Then

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

    ; Die gefundene Datei ist ein Ordner, also weitersuchen ...

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

    $aFiles = _unterordner ($DirZiel & '\' & $file, $DirStart & '\' & $file)

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

    If ($aFiles[0]) Then

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

    ; Das Subverzeichnis enthält Dateien nach unseren Suchkriterien,
    ; also prüfen wir, ob der Ordner bereits im Zielverzeichnis existiert ...

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

    If (not FileExists ($DirZiel & '\' & $file)) Then

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

    ; Es existiert noch kein Zielverzeichnis mit diesem Namen,
    ; also veschieben wir den ganzen Ordner.

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

    DirCreate ($DirZiel & '\' & $file)
    DirMove ($DirStart & '\' & $file, $DirZiel & '\' & $file, 1)
    Else
    ; Das Zielverzeichnis existiert bereits, also veschieben wir
    ; nur die Dateien.

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

    For $i = 1 To $aFiles[0]
    FileMove($aFiles[$i], $DirZiel & '\' & $file & '\', 9)
    Next
    EndIf
    EndIf

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

    ElseIf (StringCompare (StringRight ($file, 4), ".TXT", 2)) Then

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

    ; Die gefundene Datei ist entspricht den Suchkriterien,
    ; also prüfen wir, ob sie bereits im Zielverzeichnis existiert.
    ; Wenn ja, dann auf Aktualität prüfen.

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

    If (FileExists($DirZiel & '\' & $file)) Then

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

    If (FileGetTime($DirStart & '\' & $file, 0,1) <> _
    FileGetTime($DirZiel & '\' & $file, 0,1)) Then

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

    $iSize = UBound ($aFiles)
    ReDim $aFiles[$iSize + 1]
    $aFiles[$iSize] = $DirStart & '\' & $file
    $aFiles[0] = $iSize - 1
    EndIf
    Else
    $iSize = UBound ($aFiles)
    ReDim $aFiles[$iSize + 1]
    $aFiles[$iSize] = $DirStart & '\' & $file
    $aFiles[0] = $iSize - 1
    EndIf
    EndIf
    WEnd

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

    FileClose($search)
    Return $aFiles

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

    EndFunc

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


    2 Mal editiert, zuletzt von Greenhorn (16. August 2010 um 23:28)

  • Guten Motgen Greenhorn!


    Sowit hat er seine Funktion schon, das was er möchte ist das, wenn zB. $Start = c:\Musik\Mp3\Album\Interpreter\Album\interpreter\01\.mp3 nach $Ziel = interpreter\01\.mp3 veschoben wird wenn kein Verzeichnis Exestirt und wenn ja Datei überprüfen, So wie mein Beispiel wehr das kein Problem da man ja weis wo die Verzeichnise zu finden sind, so jezt mal wie Volumeman sich das vorstellt zB. \\Cluster\...\..\..\..\.datei und dan das, erste beispiel anwenden ohne zu wissen wie die Verzeichnis struktur ist.

    So habe ich es Verstanden.

    LG Kleiner

  • und warum nicht mit _FileListToArray(pfad,*,2) ;2 Return Folders only

    Spoiler anzeigen
    [autoit]


    #Include <File.au3>
    #Include <Array.au3>

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

    $FileList=_FileListToArray(@DesktopDir)
    If @Error=1 Then
    MsgBox (0,"","No Folders Found.")
    Exit
    EndIf
    If @Error=4 Then
    MsgBox (0,"","No Files Found.")
    Exit
    EndIf
    _ArrayDisplay($FileList,"$FileList")

    [/autoit]

    dieses erstellte array durchläuft dann eine for next schleife ...

    Spoiler anzeigen
    [autoit]


    Dim $aRecords
    For $x = 1 to $aRecords[0]
    Msgbox(0,'Record:' & $x, $aRecords[$x])
    Next

    [/autoit]

    dieses ergebnis kannst du dann ja wieder in ein array einlesen ( in der for next schleife) und auswerten ...

    gruß gmmg

  • So wie ich deinen Post #9 interpretiere möchtest du aus einem Ordner alle Ordner welche eine bestimmte weitere Ordnertiefe in sich besitzen.
    Also z.B. hat dein Ordner "Interpret" eine weitere Ordnertiefe von 0 (keine weiteren Unterordnerebenen).
    Dein Ordner "Rock" hat eine weitere Ordnertiefe von 1 (eine weitere Unterordnerebene nämlich "Interpret").
    Dein Ordner "Testordner" hat eine Ordnertiefe von 2 ( "Pop", "Rock", und "Electronic" mit jeweils einer Ordnertiefe von 1).
    Ich interpretiere diesen Post nun so dass du die Namen der Ordner mit einer Ordnertiefe von 0 ("Interpret") haben möchtest so dass du diese dann nach "E:\Daten" kopieren kannst?
    Wenn dem so ist dann mal hier ein Ansatz:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $aArr = GetFoldersWithDepth(@WindowsDir, 3) ;3 steht für die Ordnertiefe welche die Ordner haben sollen
    If @error Then
    MsgBox(0, "Fehler", "Fehlercode: " & @error)
    EndIf
    _ArrayDisplay($aArr)

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

    ; Gibt alle Ordner zurück mit einer Ordnertiefe von $iTiefe Ebenen
    Func GetFoldersWithDepth($sSD, Const $iTiefe, Const $bS = True)
    ;by AspirinJunkie
    Local $FFFF, $FFNF, $iX
    Local Static $sRet
    If $bS Then
    $sRet = ''
    $sSD = FileGetLongName($sSD)
    If @error Then Return SetError(1, @error, 0)
    EndIf
    $FFFF = FileFindFirstFile($sSD & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $iX = GetFolderDepth($sSD & '\' & $FFNF)
    If $iX = $iTiefe Then
    $sRet &= $sSD & '\' & $FFNF & '|'
    ContinueLoop
    EndIf
    If $iX < $iTiefe Then ContinueLoop
    GetFoldersWithDepth($sSD & '\' & $FFNF, $iTiefe, False)
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    If $bS Then
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), '|', 2)
    $sRet = 0
    Return $aRet
    EndIf
    EndFunc ;==>GetFoldersWithDepth

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

    ;Gibt die Anzahl der Unterebenen zurück
    Func GetFolderDepth($sSD)
    ;by AspirinJunkie
    Local $FFFF, $FFNF, $iX, $iC = 0
    If StringRight($sSD, 1) = '\' Then $sSD = StringTrimRight($sSD, 1)
    $FFFF = FileFindFirstFile($sSD & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $iX = GetFolderDepth($sSD & '\' & $FFNF) + 1
    If $iX > $iC Then $iC = $iX
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Return $iC
    EndFunc ;==>GetFolderDepth

    [/autoit]

    Kleiner optimierungsuchender ;)
    Folgendes sollte schneller und schlanker sein als erst den Umweg über COM-Objekte zu gehen:

    [autoit]

    FileGetLongName($Path_uo_Datei & '\..', 1)

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (17. August 2010 um 13:20)

  • Hallo Junkie!

    Fast korrekt... der Hauptpfad hat jeweils einen Unterordner für den Bereich Pop, Rock, Alternative, Electronic usw. usw. . In dem jeweiligen Ordner können durchaus mehrere Interpreten liegen...
    als Beispiel unter Electronic würden dann weitere Ordner liegen für "Blockster", "Etype", "Samantha James". Und in diesen Ordnern der Interpreten liegen dann wiederum MP3 Dateien.

    Hauptordner also D:\Testordner\
    in diesem Ordner dann Ordner für "Katergorien" (Pop, Rock, Alternative, Electronic)
    in den jeweiligen Kategorieordnern dann wiederum Interpreten-Ordner ("Blockster", "Etype", "Samantha James")
    und in dem jeweiligen Interpret-Ordner eine oder auch mehrere *.mp3

    Dabei soll dann aus dem Pfad D:\Testordner\Electronic\Blockster\*.mp3 auf e:\Daten\Blockster\*.mp3 kopiert werden, wenn der Ordner Blockster schon auf e:\Daten\ existiert bzw. verschoben werden, wenn der Ordner Blockster auf e:\Daten\ noch nicht existiert.

    Was die Schwierigkeit ist, ist halt einfach dass das Genre (z.B Electronic) auf e:\Daten\ nicht mehr sein, sondern einfach nur noch e:\Daten\Blockster\*.mp3

    Alle eure Ansätze haben den gewünschten Effekt leider nicht gebracht...
    Die Ansätze von "kleiner" waren jedoch schon fast am Ziel, außer dass dort wieder dieser "Genre-Ordner" (Electronic) mit rüberkopiert wurde und darin dann wie gewohnt Blockster\*.mp3 aber das Genre soll ja nicht mit kopiert werden...

    Ach vielleicht erkläre ich es einfach viiiiiiiiiiiel zu schwierig???

  • Mit dem Ansatz den ich dir geliefert habe bekommst du, wenn du als Ordnertiefe 0 angibst, ein Array mit allen Ordnern zurück welche diese Ordnertiefe besitzen.
    Also in deinem Fall alle Interpretenordner (völlig egal ob da mehrere Interpretenordner in einem Genre-Ordner liegen - es sollten alle gefunden werden).
    Damit solltest du doch erstmal alles haben was du brauchst (Ordner kopieren bzw. auf Existenz prüfen und ein Array durchgehen wirst du selbst hinbekommen?).
    Also ich versteh nicht was jetzt daran nicht das ist was du willst.
    Spiel doch einfach mal mit der Funktion bisschen rum in deinem Ordner und schau dann wie du es verwenden kannst.
    Oder erklär es nochmal anders.

  • So, habe das Skript nun getestet und die Patzer entfernt ...

    Der ursprüngliche Fehler war in dem rekursiven Aufruf in Deiner Funktion zu finden, Volumeman. ;)

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>

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

    $DirZiel = @DesktopDir & "\Ziel"
    $DirStart = @DesktopDir & "\Quelle"

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

    _unterordner ($DirZiel, $DirStart)

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

    Func _unterordner ($DirZiel, $DirStart)

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

    Local $search, $file, $iSize, $aFiles[1]

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

    $search = FileFindFirstFile($DirStart & "\*.*")

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

    If ($search == -1) Then _ ; Keine Dateien gefunden.
    Return $aFiles

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

    While (TRUE)

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

    $file = FileFindNextFile($search)

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

    If (@error) Then _ ; Keine weiteren Dateien gefunden.
    ExitLoop

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

    If (StringInStr(FileGetAttrib($DirStart & '\' & $file), 'D')) Then

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

    ; Die gefundene Datei ist ein Ordner, also weitersuchen ...

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

    $aFiles = _unterordner ($DirZiel, $DirStart & '\' & $file)

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

    If ($aFiles[0]) Then

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

    ; Das Subverzeichnis enthält Dateien nach unseren Suchkriterien,
    ; also prüfen wir, ob der Ordner bereits im Zielverzeichnis existiert ...

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

    If (not FileExists ($DirZiel & '\' & $file)) Then

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

    ; Es existiert noch kein Zielverzeichnis mit diesem Namen,
    ; also veschieben wir den ganzen Ordner.

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

    DirCreate ($DirZiel & '\' & $file)
    If (DirCopy ($DirStart & '\' & $file, $DirZiel & '\' & $file, 1)) Then _
    FileDelete ($DirStart & '\' & $file)
    ;~ DirMove ($DirStart & '\' & $file, $DirZiel, 1)
    Else
    ; Das Zielverzeichnis existiert bereits, also veschieben wir
    ; nur die Dateien.

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

    $bSuccess = TRUE

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

    For $i = 1 To $aFiles[0]

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

    If (FileCopy ($aFiles[$i], $DirZiel & '\' & $file & '\', 9)) Then
    FileDelete ($aFiles[$i])
    Else
    $bSuccess = FALSE
    EndIf
    ;~ FileMove ($aFiles[$i], $DirZiel & '\', 9)
    Next

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

    If ($bSuccess) Then
    FileDelete ($DirStart & '\' & $file)
    Else
    ConsoleWrite ("! Fehler beim Kopieren der Datei(en)" & @CRLF & _
    "- Quellordner wird nicht gelöscht!")
    EndIf
    EndIf

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

    ReDim $aFiles[1]
    $aFiles[0] = 0
    EndIf

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

    ElseIf (StringCompare (StringRight ($file, 4), ".TXT", 0) == 0) Then

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

    ; Die gefundene Datei ist entspricht den Suchkriterien,
    ; also prüfen wir, ob sie bereits im Zielverzeichnis existiert.
    ; Wenn ja, dann auf Aktualität prüfen.

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

    If (FileExists($DirZiel & '\' & $file)) Then

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

    If (FileGetTime($DirStart & '\' & $file, 0,1) <> _
    FileGetTime($DirZiel & '\' & $file, 0,1)) Then

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

    $iSize = UBound ($aFiles)
    ReDim $aFiles[$iSize + 1]
    $aFiles[$iSize] = $DirStart & '\' & $file
    $aFiles[0] = $iSize
    EndIf
    Else
    $iSize = UBound ($aFiles)
    ReDim $aFiles[$iSize + 1]
    $aFiles[$iSize] = $DirStart & '\' & $file
    $aFiles[0] = $iSize
    EndIf
    EndIf
    WEnd

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

    FileClose($search)
    Return $aFiles

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

    EndFunc

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

    Gruß
    Greenhorn