FileCopy abbrechen wenn Bedingung erfüllt

  • Hallo liebe AutoIT-Gemeinde,

    Kurz am Rande: Yeehaaaa mein erster Beitrag :rock:

    Ok, Back to Topic.
    Ich bastele gerade ein kleines Script, welches in dem Fall, dass der Desktop gesperrt ist, eine Datei auf einen über das Internet erreichbaren Server kopieren soll.
    Der Zustand des Desktops wird über einen DllCall ausgelesen und in eine Variable eingelesen ('0' wenn gesperrt).
    Aufgrund der zum Teil sehr geringen Bandbreite soll der Kopiervorgang beim Entsperren des PC´s abgebrochen werden, um die Arbeit nicht zu verlangsamen bzw. zu erschweren.

    Ich hänge jetzt schon 2 Tage daran den Copyjob bei erfüllen der Bedingung abzubrechen.
    Habt ihr vielleicht eine Ahnung wie das umzusetzen wäre?

    Eine zweite *.exe ist für mich leider keine Alternative.

    Eine kleine Hilfestellung bzw. ein Tipp wäre super.
    Oder hatte vielleicht schonmal jemand ein ähnliches Problem und hat einen Workaround parat? :)

    • Offizieller Beitrag

    Wo ist dein Script? Wenn man dir helfen soll, dann muß man auch wissen, was du überhaupt in deinem Script machst.

  • Ich habe es mal auf den wesentlichen Teil gekürzt.
    Ist der vollständige Quelltext noch nötig?
    Mein Quellcode ist zur Zeit noch eine strukturelle Frechheit und müsste darüber hinaus um viele vertrauliche Daten gekürzt werden.

    Entschuldige bitte, wenn ich mir das zu einfach vorgestellt habe.


    Mhh... du kannst über XCOPY.exe (Auf jedem modernen WIndows-System dabei) eine Datei kopieren. Aber ich bezweifle, dass das mit Server geht. ;)
    Ich vermute, es handelt sich hier um einen FTP-Server?

    lg chess

    Sorry chess, das habe ich unsauber beschrieben.
    Es handelt sich um VPN-angebundene Rechner. Der "Server" ist ein gemapptes Laufwerk z.B. "Y:\", was aber vermutlich noch in einen Pfad zum Share geändert wird z.B. \\Server1\Benutzername\".


    [autoit]


    while 1
    Global Const $DESKTOP_SWITCHDESKTOP = 0x100
    $p_lngHwnd = DllCall('user32.dll', 'int', 'OpenDesktopA', 'str', 'Default', 'int', 0, 'int', False, 'int', $DESKTOP_SWITCHDESKTOP)
    If $p_lngHwnd = 0 then
    If FileCopy($from_path, $to_path, 8) Then
    FileMove($to_path, $old_path) ;wird zuerst unter Alternativnamen gespeichert um beim Abbruch inkonsistenz zu verhindern und "moved" um den Namen zu ändern
    EndIf
    endif
    wend

    [/autoit]
  • Ein FileCopy lässt sich nicht unterbrechen.Du müsstest schon über DLL-Calls die Original Windows Routinen ansprechen. Jierfür habe ich schon eine UDF gesehen, benutze einfach einmal die SuFu oder Google.
    Auch mit dem on chesstiger angesprochenen XCOPY sollte ein Abbruch möglich sein.

    Dein Vorhaben klingt so als ob du etwas zu verbergen hättest was dem zu überwachendem Mitarbeiter nicht auffallen darf.

    mfg autoBert

  • Hallo autoBert,

    danke für deine schnelle Reaktion! :)

    Ein FileCopy lässt sich nicht unterbrechen.Du müsstest schon über DLL-Calls die Original Windows Routinen ansprechen. Jierfür habe ich schon eine UDF gesehen, benutze einfach einmal die SuFu oder Google.
    Auch mit dem on chesstiger angesprochenen XCOPY sollte ein Abbruch möglich sein.

    Kannst du dich zufällig noch an den Namen der UDF erinnern? Bin für jedes Detail dankbar.
    Ich werde bei Möglichkeiten mal testen und hier mein Feedback preisgeben.

    Dein Vorhaben klingt so als ob du etwas zu verbergen hättest was dem zu überwachendem Mitarbeiter nicht auffallen darf.

    Dieser Vorwurf ist einfach nur dreist!
    Es handelt sich lediglich um ein Backup einer Configdatei, das dazu beiträgt, dass der Anwender an jedem PC die selben Settings in einer Anwendung hat.
    Die Daten werden nicht abgegriffen, lediglich auf deren eigenen Netzlaufwerken gesichert, auf die man bekannterweise nicht ohne weiteres zugreifen kann und darf.


    Grüße Jobi05

  • Probier das mal, sollte funktionieren und die Größe kannst du über die Variable Step einstellen

    Spoiler anzeigen
    [autoit]

    $Step = 10000
    Global Const $DESKTOP_SWITCHDESKTOP = 0x100
    $from_path = FileOpenDialog("test", "", "Alle (*.*)")
    $hFile = FileOpen($from_path, 16)
    $test = FileRead($hFile)
    FileClose($hFile)
    For $i = 0 To BinaryLen($test) Step $Step
    $p_lngHwnd = DllCall('user32.dll', 'int', 'OpenDesktopA', 'str', 'Default', 'int', 0, 'int', False, 'int', $DESKTOP_SWITCHDESKTOP)
    If $p_lngHwnd = 0 Then
    $hFile = FileOpen(@DesktopDir & "\test.zip", 16 + 2 + 8)
    FileWrite($hFile, BinaryMid($test, $i + 1, $Step))
    FileClose($hFile)
    Else
    While $p_lngHwnd <> 0
    Sleep(100)
    $p_lngHwnd = DllCall('user32.dll', 'int', 'OpenDesktopA', 'str', 'Default', 'int', 0, 'int', False, 'int', $DESKTOP_SWITCHDESKTOP)
    WEnd
    EndIf
    Next

    [/autoit]
  • Kannst du dich zufällig noch an den Namen der UDF erinnern? Bin für jedes Detail dankbar.


    Nein aber die in Frage kommenden Autoren sind: funkey, progandy, bugfix

    Dieser Vorwurf ist einfach nur dreist!
    Es handelt sich lediglich um ein Backup einer Configdatei, das dazu beiträgt, dass der Anwender an jedem PC die selben Settings in einer Anwendung hat.


    Diese Dateien sind nicht so gross, das man es hinter dem Rücken des Benutzers machen muss. Ich denke einmal da will ein Admin (auf Anordnung des Chefs?) seinen Mitarbetern hinter her spionieren.

    mfg autoBert

  • Das gibt es sicher schon einige Male, aber ich hab's schnell nochmal gemacht.

    Spoiler anzeigen
    [autoit]

    HotKeySet("+{ESC}", "_AbortCopy") ;Shift+Escape
    Global $iAbort = 0
    Global $iOK = _FileCopyEx("large.zip", "large_copy.zip", "_Callback")

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

    Func _FileCopyEx($sSource, $sDest, $sCallback, $iOverWrite = 1, $iStepBytes = 8388608)
    If StringInStr(FileGetAttrib($sDest), "D") Then $sDest &= StringTrimLeft($sSource, StringInStr($sSource, "\", 0, -1) - 1)
    If $iOverWrite = 0 And FileExists($sDest) Then Return 1

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

    Local $hSource = FileOpen($sSource, 16)
    If $hSource = -1 Then Return SetError(1, 0, 0)

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

    If FileExists($sDest) Then FileDelete($sDest)

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

    Local $hDest = FileOpen($sDest, 17)
    If $hDest = -1 Then
    FileClose($hSource)
    Return SetError(2, 0, 0)
    EndIf

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

    Local $iSize = FileGetSize($sSource)
    Local $iMod = Mod($iSize, $iStepBytes)
    Local $iCount = Int(Floor($iSize / $iStepBytes))
    Local $bTemp

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

    For $i = 1 To $iCount
    If Call($sCallback, $i * $iStepBytes, $iSize) = 0 Then ;Abort
    FileClose($hSource)
    FileClose($hDest)
    FileDelete($sDest)
    Return SetError(3, 0, 0)
    EndIf

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

    $bTemp = FileRead($hSource, $iStepBytes)
    FileWrite($hDest, $bTemp)
    Next

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

    If $iMod <> 0 Then
    $bTemp = FileRead($hSource, $iMod)
    FileWrite($hDest, $bTemp)
    EndIf

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

    FileClose($hSource)
    FileClose($hDest)

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

    Return SetError(0, 0, 1)
    EndFunc

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

    Func _Callback($iBytesCopied, $iBytesTotal)
    ConsoleWrite(StringFormat("Bytes copied: %i / %i", $iBytesCopied, $iBytesTotal) & @CRLF)
    ;Hier die jeweilige Abbruchbedingung einbauen
    If $iAbort = 1 Then
    Return 0 ;Abort
    Else
    Return 1 ;Continue
    EndIf
    EndFunc

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

    Func _AbortCopy()
    $iAbort = 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hallo TheLuBu,

    dein Script kann ich leider nicht testen -> AutoIT PopUp fehler: "Error allocating memory"
    Weißt du was ich da falsch mache?

    Mit xCopy habe ich ein Problem, weil das Script so ja nicht erkennen kann ob der Kopiervorgang erfolgreich abgeschlossen ist.

    2 Mal editiert, zuletzt von jobi05 (26. Juli 2012 um 10:28)

  • Die Testdatei hatte ~2GB habe es aber auch mit ~1,5MB versucht. Es lag vermutlich am *.zip file.
    Mit einem Textdokument ist der Fehler nicht mehr aufgetreten.