Dircopy "öffnet den Ordner

  • Hallo liebe Com

    Ich habe mir einen Script gebastelt, der meinen USB Stick synchronisieren soll, sobald er eingesteckt wurde und etwas verändert wurde.

    Nun zu meinem Problem:
    Über die Function DirCopy will ich nun alle Ordner von meinem Stick in einen Speicherort speichern. soweit so gut, nur dass dircopy die Ordner auf meinem Stick "öffnet" und dann den Inhalt, also nicht den übergeordneten Ordner kopiert.
    Falls sich jemand durch meine Scripts durchwurschteln will ;) :
    (achso, sind eine meiner ersten Scripts)

    Spoiler anzeigen
    [autoit]

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

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

    $StickMax = _FileCountLines(@scriptdir & "\Sticks.log")
    Dim $i = 64, $Sticks[$StickMax], $Sticknumber = 0, $counterstick = 1, $counterort = 1

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

    _FileReadToArray(@scriptdir & "\Sticks.log", $Sticks)

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

    While 1 ;__________________________________________________________________________________warten, bis Stick eingesteckt wurde
    $i = $i + 1
    $Sticknumber = $Sticknumber +1
    If Drivegetlabel(Chr($i) & ":") = $Sticks[$Sticknumber] Then
    _Synchstart()
    ExitLoop
    ElseIf $Sticknumber = $StickMax Then
    $Sticknumber = 0
    ElseIf $i = 90 Then
    $i = 64
    EndIf

    WEnd

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

    Func _Synchstart()
    $Sticklabel = Chr($i) & ":\"
    $Index = _ArraySearch($Sticks, $Sticks[$Sticknumber])
    $Speicherort = $Sticks[$Index +1]
    $Stickdateien = _FileListToArray($Sticklabel)
    $Speicherdateien = _FileListToArray($Speicherort)
    _ArrayDisplay($Stickdateien)
    If not(DirGetSize($Sticklabel) = DirGetSize($Speicherort)) Then
    TrayTip("Synchronisation", "Stick wird synchronisiert",5 ,2)
    Do
    If not($Stickdateien[$counterstick] = $Speicherdateien[$counterort]) Then
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort, 1)
    $counterort = $counterort -1
    ElseIf not(Dirgetsize($Sticklabel & $Stickdateien[$counterstick]) = Dirgetsize($Speicherort & $Speicherdateien[$counterort])) Then
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & $Speicherdateien[$counterort], 1)
    $counterstick = $counterstick + 1
    $counterort = $counterort + 1
    Endif
    $counterort = $counterort + 1
    $counterstick = $counterstick + 1
    Until $counterstick = $Stickdateien[0]
    Traytip("Synchronisation", "Stick erfolgreich Synchronisiert!", 5, 2)
    FileDelete($Speicherort & "\log.log")
    sleep(5000)
    Exit
    EndIf
    TrayTip("Synchronisation", "keine Synchronisation erforderlich.", 5, 2)
    Sleep(5000)

    EndFunc

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <File.au3>
    #include <Array.au3>

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

    Dim $i = 0

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

    _anpassen()

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

    Func _anpassen() ;___________________________________________________________________________neu anlegen von Ordnern
    $Button = MsgBox(1, "", "Bitte zu Synchronisierenden USB-Stick auswählen")
    If $Button = 2 Then
    MsgBox(0, "Synchronisation", "Programm wird beendet")
    Exit
    EndIf
    $Stickname = FileSelectFolder ( "Stickauswahl", "")
    If @error = 1 Then
    MsgBox(0, "", "USB-Stick auslesen fehlgeschlagen, Programm wird geschlossen", 10)
    Exit
    EndIf
    $Button = MsgBox(1, "", "Bitte Speicherort auswählen")
    If $Button = 2 Then
    MsgBox(0, "Synchronisation", "Programm wird beendet")
    Exit
    EndIf
    $Speicherort = FileSelectFolder( "Speicherortauswahl", "")
    If @error = 1 Then
    MsgBox(0, "", "Speicherort auslesen fehlgeschlagen, Programm wird geschlossen", 10)
    Exit
    EndIf

    $Stick = DriveGetLabel($Stickname)
    $OpenedFile = FileOpen(@ScriptDir & "\log.log", 1)
    FileWrite($OpenedFile, @CRLF & @MDAY & "\" & @MON & "\" & @YEAR & ", " & @HOUR & ":" & @MIN & ":" & @CRLF & "Neuer Stick hinzugefügt: " & $Stick & @CRLF)
    FileClose($OpenedFile)
    DirCreate($Speicherort & "\" & $Stick)
    FileWrite($Speicherort & "\" & $Stick & "\log.log", "")
    $OpenedFile = FileOpen(@ScriptDir & "\Sticks.log", 1)
    FileWrite($OpenedFile, $Stick & @CRLF)
    FileWrite($OpenedFile, $Speicherort & "\" & $Stick & @CRLF )
    FileClose($OpenedFile)
    MsgBox(0, "", "Erfolgreich abgeschlossen")
    EndFunc

    [/autoit]

    Das erste Script syncronisiert den Stick, das 2. konfiguriert .txt dateien, damit das 1. Script weiß, wie der Stick heißt etc.

    Please help

    PS: Bei mir ist der Weg das ziel, also bitte nicht mit: "Da gibts doch schon viel mächtigere Scripts" kommen ;) .

    Einmal editiert, zuletzt von noobwannabot (21. November 2010 um 15:34)

  • Hallo ,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu:

    Über die Function DirCopy will ich nun alle Ordner von meinem Stick in einen Speicherort speichern. soweit so gut, nur dass dircopy die Ordner auf meinem Stick "öffnet" und dann den Inhalt, also nicht den übergeordneten Ordner kopiert.


    DirCopy öffnet keine Ordner sondern kopiert den Inhalt (samt Unterordner) scheint ein Verständnisproblem zu sein,

    PS.: du solltest deinen Nick ändern,

    mfg autoBert

  • Hi,

    [...]nur dass dircopy die Ordner auf meinem Stick "öffnet" und dann den Inhalt, also nicht den übergeordneten Ordner kopiert.


    Wenn das so ist, warum gibst du nicht als Ziel den übergeordneten Ordner an?

    Das Skript hat noch einige macken...
    ...die sind mir bisher aufgefallen:

    • [autoit]$i = $i + 1
      $Sticknumber = $Sticknumber +1
      If Drivegetlabel(Chr($i) & ":") = $Sticks[$Sticknumber] Then[/autoit]
      Du gehst ja hier mit chr() die laufwerksbuchstaben durch, um Drivegetlabel zu erhalten, soweit ok.
      Aber warum änderst du dauernd $Sticknumber? Schau dir nochmal das Array $Sticks an ;)
    • [autoit]$Index = _ArraySearch($Sticks, $Sticks[$Sticknumber])[/autoit]
      Eigentlich nicht schlimm, aber ein Umweg ^^
      Mit _ArraySearch durchsuchst du das Array $Sticks nach einem Suchbegriff (den du mit $Sticks[ INDEX ] übergibst) und als Ergebnis von _ArraySearch erhälst du den INDEX des Array $Sticks in welchem der Suchbegriff zu finden ist.
      Da beist sich die Katze selbst in den Schwanz! ;)
    • [autoit]ElseIf not(Dirgetsize($Sticklabel & $Stickdateien[$counterstick]) = Dirgetsize($Speicherort & $Speicherdateien[$counterort])) Then
      DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & $Speicherdateien[$counterort], 1)
      $counterstick = $counterstick + 1
      $counterort = $counterort + 1
      Endif
      $counterort = $counterort + 1
      $counterstick = $counterstick + 1[/autoit]
      Angenommen du bist im ElseIf-Zweig und kopierst den Ordner,
      danach erhöst du im ElseIf-Zweig die beiden Indexe und direkt nach dem EndIf nochmal das ganze!
      Hast du dann nicht einen Eintrag im $Stickdateien / $Speicherdateien übersprungen? ;)
    • [autoit]$Stick = DriveGetLabel($Stickname)[/autoit]
      Auch nicht Schlimm, aber macht den Code unleserlich(er) ^^
      DriveGetLabel gibt dir, wie der Name schon sagt, ein Label also den Laufwerksnamen zurück.
      Also warum nicht so? ;)
      [autoit]$Stickname = DriveGetLabel($Stick)[/autoit]
  • danke Cyberton für deine Hilfe.
    die Fehler wurden von mir inzwischen zuhause behoben.
    Du fragst, warum ich nicht den übergeordneten Ordner kopier? Ich hab mir nur überlegt, dass, wenn ich den übergeordneten Ordner kopiere, sprich der gesamte Stick, würde es bei z.b 8gb großen Sticks ewigkeiten dauern, da das programm, sobald irgendeine datei gespeichert würde, den gesamten Stick kopiert.


    Danke
    Noobwanabot

    Edit: über das _Arraysearch durchsuche ich ja mein Array nach dem Suchbegriff. Jetzt brauche ich aber den Speicherort des backups des Sticks. D.h., ich muss INDEX um +1 erhöhen, da der Speicherort (in der .txt datei) eine Zeile unter dem Sticknamen steht. Aber du hast recht, ich könnte das ganze verkürzen über

    [autoit]

    $Speicherort = _ArraySearch($Sticks, $Sticks[$Sticknumber]) +1

    [/autoit]

    Einmal editiert, zuletzt von noobwannabot (21. November 2010 um 08:49)


  • Du fragst, warum ich nicht den übergeordneten Ordner kopier?


    Nein so meinte ich das nicht:
    So wie ich dich verstanden habe, hast du gemeint:

    • F:\ (<-- USB Stick; Name=usbstick)
    • F:\Daten (<--- ist ein neuer Ordner; Inhalt: a.txt)
    • Du machst jetzt DirCopy --> "F:\Daten\" --> "C:\backup\usbstick\"
    • Ergebnis:
      "F:\Daten\a.txt"
      wurde nach
      "C:\backup\usbstick\a.txt"
      kopiert

    Damit das nicht passiert musst du halt den übergeordneten Ordner am Ziel mit angeben!
    Meine Version:

    • F:\ (<-- USB Stick; Name=usbstick)
    • F:\Daten (<--- ist ein neuer Ordner; Inhalt: a.txt)
    • Du machst jetzt DirCopy --> "F:\Daten\" --> "C:\backup\usbstick\Daten\"
    • Ergebnis:
      "F:\Daten\a.txt"
      wurde nach
      "C:\backup\usbstick\Daten\a.txt"
      kopiert


    Du musst halt noch das Ziel bei DirCopy anpassen, aber nur, wenn es sich um einen Ordner handelt ;)



    Edit: über das _Arraysearch durchsuche ich ja mein Array nach dem Suchbegriff. Jetzt brauche ich aber den Speicherort des backups des Sticks. D.h., ich muss INDEX um +1 erhöhen, da der Speicherort (in der .txt datei) eine Zeile unter dem Sticknamen steht. Aber du hast recht, ich könnte das ganze verkürzen über

    [autoit]

    $Speicherort = _ArraySearch($Sticks, $Sticks[$Sticknumber]) +1

    [/autoit]


    Ja, um den "Speicherort des backups" zu bekommen musst du den Index um 1 erhöhen.
    Aber so wie du das jetzt machst, enthält dann die Var $Speicherort die Index Nr. des "Speicherort des backups"...!?
    Geht viel einfacher (ausgehend vom ursprünglichem Skript):
    Also statt:

    [autoit]

    $Index = _ArraySearch($Sticks, $Sticks[$Sticknumber])
    $Speicherort = $Sticks[$Index +1]

    [/autoit]


    Schreibst du:

    [autoit]


    $Speicherort = $Sticks[$Sticknumber+1]

    [/autoit]


    :thumbup:

  • Ach so hast du das geimeint. Dann werd ich mal gleich umscripten. ich schreib dann ins edit, obs geklappt hat :D

    du bis echt :thumbup:

    €dit:
    Des Speicherort und so weiter funktioniert auch (o Wunder :D)

    Jetzt habe ich das auch mit den Ordner kopieren gemacht. Allerdings werden jetzt auch normale dateien, die also keine Ordner sind, als ordner erstellt.
    Über FileExists wollte ich jetzt prüfen, ob das auch wirklich Ordner sind, nur bekomm ich immer zurück, dass die datei (z.B.) Autoit.au3 ein Ordner
    Eingeben tu ich:

    [autoit]

    If FileExists($Stickdateien[$counterstick] & ".*") = 1 Then

    [/autoit]


    oder gibt mir fileExists nur .tx dateien an???

    Hier ist das Script:

    Spoiler anzeigen
    [autoit]


    Func _Synchstart()
    $Sticklabel = Chr($i) & ":\"
    $Speicherort = $Sticks[$Sticknumber+1]
    $Stickdateien = _FileListToArray($Sticklabel)
    $Speicherdateien = _FileListToArray($Speicherort)
    If not(DirGetSize($Sticklabel) = DirGetSize($Speicherort)) Then
    TrayTip("Synchronisation", "Stick wird synchronisiert",5 ,2)
    Do
    If FileExists($Stickdateien[$counterstick] & ".*") = 1 Then
    If not ($Stickdateien[$counterstick] = $Speicherdateien[$counterort]) Then
    FileCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    $counterort = $counterort -1
    ElseIf not(Filegetsize($Sticklabel & $Stickdateien[$counterstick]) = Filegetsize($Speicherort & $Speicherdateien[$counterort])) Then
    FileCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    EndIf
    $counterort = $counterort +1
    $counterstick = $counterstick + 1
    EndIf

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

    If not($Stickdateien[$counterstick] = $Speicherdateien[$counterort]) Then
    Dircreate($Speicherort & "\" & $Stickdateien[$counterstick])
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    $counterort = $counterort -1
    ElseIf not(Dirgetsize($Sticklabel & $Stickdateien[$counterstick]) = Dirgetsize($Speicherort & $Speicherdateien[$counterort])) Then
    Dircreate($Speicherort & "\" & $Stickdateien[$counterstick])
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    Endif
    $counterort = $counterort + 1
    $counterstick = $counterstick + 1

    Until $counterstick = $Stickdateien[0]
    Traytip("Synchronisation", "Stick erfolgreich Synchronisiert!", 5, 2)
    FileDelete($Speicherort & "\log.log")
    sleep(5000)
    Exit
    EndIf
    TrayTip("Synchronisation", "keine Synchronisation erforderlich.", 5, 2)
    Sleep(5000)

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

    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von noobwannabot (21. November 2010 um 14:14)

  • ok... Problem gelöst. Ich suche einfach per Stringregexp nach \.... (also z.b.: irgendwas.xxx) :D

    Hier ist das Script. jetzt werde ich nur noch Attribute hinzufügen (versteckte Ordner werden versteckt gespeichert)

    Spoiler anzeigen
    [autoit]

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

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

    $StickMax = _FileCountLines(@scriptdir & "\Sticks.log")
    Dim $i = 64, $Sticks[$StickMax], $Sticknumber = 0, $counterstick = 1, $counterort = 1

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

    _FileReadToArray(@scriptdir & "\Sticks.log", $Sticks)

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

    _Search()

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

    Func _Search()
    While 1 ;__________________________________________________________________________________warten, bis Stick eingesteckt wurde
    Do
    $i = $i + 1
    Do
    $Sticknumber = $Sticknumber +1
    If Drivegetlabel(Chr($i) & ":") = $Sticks[$Sticknumber] Then
    _Synchstart()
    ExitLoop
    EndIf
    Until $Sticknumber = $StickMax
    $Sticknumber = 0
    Until $i = 90
    $i = 64
    _Search()

    WEnd
    EndFunc

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

    Func _Synchstart()
    $Sticklabel = Chr($i) & ":\"
    $Speicherort = $Sticks[$Sticknumber+1]
    $Stickdateien = _FileListToArray($Sticklabel)
    $Speicherdateien = _FileListToArray($Speicherort)
    If not(DirGetSize($Sticklabel) = DirGetSize($Speicherort)) Then
    TrayTip("Synchronisation", "Stick wird synchronisiert",5 ,2)
    Do
    If StringRegExp($Stickdateien[$counterstick], "\....") = 1 Then
    If not ($Stickdateien[$counterstick] = $Speicherdateien[$counterort]) Then
    FileCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    $counterort = $counterort -1
    ElseIf not(Filegetsize($Sticklabel & $Stickdateien[$counterstick]) = Filegetsize($Speicherort & $Speicherdateien[$counterort])) Then
    FileCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    EndIf
    $counterort = $counterort +1
    $counterstick = $counterstick + 1
    EndIf

    If not($Stickdateien[$counterstick] = $Speicherdateien[$counterort]) Then
    Dircreate($Speicherort & "\" & $Stickdateien[$counterstick])
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    $counterort = $counterort -1
    ElseIf not(Dirgetsize($Sticklabel & $Stickdateien[$counterstick]) = Dirgetsize($Speicherort & $Speicherdateien[$counterort])) Then
    Dircreate($Speicherort & "\" & $Stickdateien[$counterstick])
    DirCopy($Sticklabel & $Stickdateien[$counterstick], $Speicherort & "\" & $Stickdateien[$counterstick], 1)
    Endif
    $counterort = $counterort + 1
    $counterstick = $counterstick + 1

    Until $counterstick = $Stickdateien[0]
    Traytip("Synchronisation", "Stick erfolgreich Synchronisiert!", 5, 2)
    FileDelete($Speicherort & "\log.log")
    sleep(5000)
    Exit
    EndIf
    TrayTip("Synchronisation", "keine Synchronisation erforderlich.", 5, 2)
    Sleep(5000)

    EndFunc

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


    Danke vor allem Cyberdyne für seine guten Einfälle/Hilfen.

  • ok... Problem gelöst. Ich suche einfach per Stringregexp nach \.... (also z.b.: irgendwas.xxx) :D


    auch ne Lösung :D

    Oder du verwendest gleich

    [autoit]

    FileGetAttrib ( "filename" )

    [/autoit]


    Wenn in dem Rückgabe String ein "D" vorkommt, dann wars ein Ordner (Directory) ;)