_Array: Daten aus Ini generieren und an FileCopyEx übergeben.

  • Hallo zusammen,

    ich habe ein Skript welches Daten von A nach B kopiert. Die zu kopierenden Daten sind in der Ini zusammengefasst. Im Moment sind dort 40 Pfade eingetragen, diese können nach Belieben erweitert werden.

    Zum Kopieren verwenden ich die FileCopyEx Funktion von Oscar. Das Ganze funktioniert soweit perfekt.

    Nun zu dem Problem welches ich habe. Die Funktion generiert für jeden Eintrag in der Ini ein neues Array. Das führt jedoch zu Problemen beim Abbruch des Kopiervorgangs, da ich ab der Stelle alle nachfolgenden Kopieraktionen abbrechen muss.

    Ich habe mit Hilfe von Google und AutoIt versucht das Ganze in ein Großes Array zu packen, leider ohne Erfolg.

    Hier im Forum habe ich einen Ansatz dazu gefunden, es gelingt mir jedoch nicht den Code von Barbene03 an meine Bedürfnisse anzupassen. Array Dir Copy with Progressbar (#4)

    Die Ini ist wie folgt aufgebaut:

    [Quellen]

    01=d:\Documents\Desktop

    02=d:\Documents

    03=C:\Users\Mitac\Downloads

    04=C:\Users\Mitac\Favorites

    05=C:\Users\Mitac\Music

    06=C:\Users\Mitac\Pictures

    07=C:\Users\Mitac\Videos

    08=C:\Users\Mitac\Links

    09=C:\Users\Mitac\Documentum

    10=C:\Users\Mitac\Kontakte

    11=C:\Users\Mitac\_Datenaufnahme

    12=C:\Users\Mitac\AppData\Local\Microsoft\OneNote

    13=C:\Users\Mitac\AppData\Local\Microsoft\FORMS

    Vielleicht kann mir jemand von Euch ein paar Zeilen Code zur Verfügung stellen mit der sich das realisieren lässt.

    Im Voraus vielen Dank. Mitac

    • Offizieller Beitrag

    Du musst zuerst alle Quellpfade in ein 1D Array packen, welches du an die Copy-Funktion übergibst:

    EDIT:

    Oder aber man erstellt sich eine allgemeingültige Funktion, um Sektionswerte in ein Array zu packen (wahlweise mit/ohne Zähler Elemente) und verwendet diese:

  • Du schreibst: .....Das führt jedoch zu Problemen beim Abbruch des Kopiervorgangs....

    wiso bricht der Kopiervorgang ab? wenn es etwas zu kopieren gibt --> sollte der Kopiervorgang doch nicht abgebrochen werden?

    Gehe vor wie Bugfix das angeregt hat. Und prüfe weshalb der Kopiervorgang abbricht....

    Vielleicht solltest Du darüber nachdenken ob Du alle Dateien im Pfad kopieren willst also z.B. D:\Test\*.* oder nur bestimmte Dateien

    D:\Test\*.pdf oder auch etwas in der Art *.office --> wobei Du dann im office deffinieren mußt.

    Die Exclude Dateien würde ich ebenfalls in die Ini packen, und nicht im Source verstecken...

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo zusammen,

    @BugFix, danke für den Code, leider bringt mich das im Moment nicht weiter. Die zweite Routine rödelt mehr als 40 Sekunden, danach werden aber keine Daten angezeigt.

    Der Kopiervorgang startet auch nicht.

    @Peter S. Taler, der Kopiervorgang funktioniert mit Oscars Funktion perfekt. Die Excludes sind in der Ini enthalten. Der Anwender kann sie ebenso wie die zu kopierenden Pfade nach belieben erweitern.

    Es geht genau darum was AspirinJunkie geschrieben hat.

    Nur zur Info, in FileCopyEx ist bereits eine Funktion enthalten die vor dem Kopiervorgang ein Array der zu kopierenden Daten erstellt.

    Da ich 40 Einträge habe, werden 40 Arrays in folge erstellt. Ich fände es schöner wenn man die Funktion so aufbohren könnte, das Sie im Vorfeld ein Array für alle Daten erstellt.

    Spoiler anzeigen

    Func _FileCopyEx_CreateArrays($sSourceDir, $sDestDir, ByRef $aSourceFiles, ByRef $aDestDir, $sMask = '*', $iRecur = $FLTAR_RECUR)

    $aSourceFiles = _FileListToArrayRec($sSourceDir, $sMask, $FLTAR_FILES, $iRecur, $FLTAR_SORT)

    If @error Then Return SetError(1, 0, 0) ; wenn sich im Quellverzeichnis keine Dateien befinden, dann Fehlercode = 1

    If IsNumber($aSourceFiles[0]) Then _ArrayDelete($aSourceFiles, 0) ; wenn das Array 1-basiert ist, dann den "Zähler" entfernen

    ReDim $aDestDir[UBound($aSourceFiles)]

    Local $sTmp = ''

    If StringRight($sSourceDir, 1) <> '\' Then $sSourceDir &= '\' ; wenn beim Quellverzeichnis der hintere Backslash fehlt, dann hinzufügen

    If StringRight($sDestDir, 1) <> '\' Then $sDestDir &= '\' ; wenn beim Zielverzeichnis der hintere Backslash fehlt, dann hinzufügen

    For $i = 0 To UBound($aSourceFiles) - 1

    $sTmp = StringRegExpReplace($aSourceFiles[$i], '(.+\\).*', '$1') ; Verzeichnis aus der Quelldatei extrahieren

    If $sTmp = $aSourceFiles[$i] Then $sTmp = '' ; wenn kein Verzeichnis vorhanden, dann einen Leerstring benutzen

    $aDestDir[$i] = $sDestDir & $sTmp ; Zielverzeichnis anhand der Quelldatei erstellen

    $aSourceFiles[$i] = $sSourceDir & $aSourceFiles[$i] ; der Quelldatei das Quellverzeichnis voranstellen

    Next

    Return SetError(0, 0, 1)

    EndFunc ;==>_FileCopyEx_CreateArrays

    Falls sich jemand die UDF mal näher anschauen möchte, hier der Link : _FileCopyEx

    Danke und Grüße

    Mitac.

  • In der UDF / Beispieldatei steckt ein allgemeiner Fehler in Autoit. Sofern ein Script direkt im root des Laufwerks läuft z.B. F:\ gibt es ein grundlegendes Problem mit @ScriptDir. Diese liefert bei F:\test.au3 als Pfad F:\ bei F:\test\test.au3 wird F:\test geliefert. Also einmal mit und einmal ohne Backslash. Wer also grundsäzlich einen Backslash nach @scribtDir anfügt bekommt für den Fall, dass das Script im Root läuft ein F:\\ siehe hierzu angehängtes Bild. Also ich fange das zu Beginn jedes Scriptes dadurch ab, dass ich eine eigene v_script deffiniere die als Pfad zu F:\ nur F: enthällt sich also im root des Laufwerkes so verhält wie in den Unterverzeichnissen. Siehe angehängtes Bild aus der Verlinkten Probe udf. Dort gibt es ein \\ .

    Das aber nur so nebenbei. Sollte man mal in die deutsche Hilfe aufnehmen? Ich frag da mal nach.

    Gruß

    Peter

    Dateien

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • AspirinJunkie

    sorry das mit den Makros hatte ich überlesen. Ich mag keine Diskussion anzetteln, aber für logisch halte ich es nicht..... und der Schritt von unlogisch nach B.... ist klein - aber lassen wir das ! Notwendig ist dann entweder wie BugFix oder wie ich ganz zu Anfang meiner Skripte...

    if stringlen(@ScriptDir) <= 3 Then

    $Start_dir = Stringleft (@ScriptDir, 2)

    Else

    $Start_dir = @ScriptDir

    EndIf

    und im folgenden anstelle @ScriptDir nur noch $start_dir verwenden..... oder oder oder - Lösungen gibt es einige - aber man muss daran denken.

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)