Kopiervorgang überprüfen

  • Hi,

    Leute ihr seid meine letzte Rettung!

    Und zwar habe ich für meine Arbeit ein größeres Skript erstellt, das Ordner auf vorhandene Dateien überprüft und diese dann verarbeitet (mehr kann ich leider nicht dazu schreiben...)

    Mein Problem ist nun, dass oft schon mit der Verarbeitung begonnen wird, während die Datei noch kopiert wird, was dann zu Dateifehlern führt....

    Ich habe schon versucht in bestimmten zeitabständen die Dateigrößen auszulesen und diese dann am Ende zu vergleichen....
    Leider funktioniert das nicht, da die zu überprüfenden Ordner im Netzwerk liegen und mir "FileGetSize()" und "DirGetSize()"
    die gesamte endgröße liefern, also immer die selbe....

    Bin so langsam am Verzweifeln, denn eine allgemeine Pause von ca. 2 Minuten einzubauen bevor mit der Verarbeitung begonnen wird stellt mich nicht wirklich zufrieden :D

    Kennt Ihr vielleicht noch eine Möglichkeit um festzustellen, ob die entsprechende datei schon fertig kopiert ist?

    Schonmal danke =)

    mfg

    *mow*

    Einmal editiert, zuletzt von *mow* (1. Juli 2010 um 12:53)

  • Die Dateien werden ganz normal per Copy & Paste kopiert!

    Leider hab ich auf die Ausgangsdateien keinen Zugriff... sie werden von verschiedenen Benutzern an verschiedenen
    Standorten in diese Netzwerkordner kopiert. Mein Skript "sieht" also nur die Zieldatei!

    Notfalls muss ich halt doch eine allgemeine Pause einbauen... aber besser fänd ich die Überwachung ob die Datei bereites
    fertig kopiert ist.....

    Danke schonmal!

    • Offizieller Beitrag

    Du könntest für jede Datei zweimal kurz hintereinander (kurzen Sleep dazwischen) die Größe holen (FileGetSize) und vergleichen. Wenn die Größe übereinstimmt, dann ist der Kopiervorgang beendet.
    Das ist zwar auch nicht ganz sicher (je nach Sleep und Kopiergeschwindigkeit), aber wenn Du ansonsten keine Möglichkeit hast...

    Gibt es denn nicht die Möglichkeit, dass die verschiedenen Benutzer am Ende des Kopiervorgangs eine Null-Byte-Datei mit einem definierten Dateinamen kopieren? Dann könnte Dein Skript auf diese spezielle Datei warten.

  • Das mit der Größe überprüfen hab ich schon in allen variationen probiert.....
    Er bekommt bei jeder Anfrage die selbe größe raus....
    Wenn ich das ganze mit einem lokalem File probiere funktionierts dagegen...

    Das mit der 0 Byte Datei funktioniert leider nicht... das wäre den Benutzern schon zu viel aufwand :D

  • Vielleicht hilft dir das mit der größe.

    [autoit]

    Const $vMapFilesArray[4][2] = [ _ ;Contains information about the mapfiles ( $Array[x][0] = Filename, $Array[x][1] = Filesize)
    ["Read_Me_!.txt", 145], _
    ["Settings.ico", 432260], _
    ["Rubik-Pocket-Cube.ico", 372532], _
    ["exit.ico", 94198]]

    [/autoit]

    Die zahlen dahinter ist die größe. Rechtsklick auf eine datei von dir und eigenschaften.

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

    If IniRead(@ScriptDir & "\Data.ini", "Settings", "Check", 1) = 1 And _SM_Check4MapFiles() = 1 Then
    $hGUI = GUICreate("Files", 300, 210)
    GUICtrlCreateLabel("Some Files might be missing or damaged. The minimap and big map in SApfel Manager will only work if the latest Files are installed. Therefore create a folder 'Files' and put the mappics into it." & @CRLF & "You can either download the mapfiles by yourself (visit http://sch0k0neger.de) or SApfel Manager will install the Files for you. If you click on Yes, SApfel Manager will download and install the Files." & @CRLF & @CRLF & "Auto install the Files?", 10, 10, 280, 140)
    $hCheckBoxMsg = GUICtrlCreateCheckbox("Never show this message again! (Not recommended)", 10, 150)
    $hButtonYes = GUICtrlCreateButton("Yes", 30, 175, 90)
    $hButtonNo = GUICtrlCreateButton("No", 180, 175, 90)
    WinSetOnTop($hGUI, "", 1)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $hButtonNo
    If GUICtrlRead($hCheckBoxMsg) = 1 Then IniWrite(@ScriptDir & "\Data.ini", "Settings", "Check", 0)
    GUIDelete()
    ExitLoop
    Case $hButtonYes
    If GUICtrlRead($hCheckBoxMsg) = 1 Then IniWrite(@ScriptDir & "\Data.ini", "Settings", "Check", 0)
    GUISetState(@SW_HIDE, $hGUI)
    ;Befehll zum installieren
    GUIDelete($hGUI)
    ExitLoop
    EndSwitch
    WEnd
    EndIf

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

    ; Dein Gui oder sonst was ^^

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

    Func _SM_Check4MapFiles()
    For $z = 0 To UBound($vMapFilesArray) - 1
    $v_File = @ScriptDir & "\Ordner\" & $vMapFilesArray[$z][0] ; in dem ordner sind die Datein zum checken
    If Not FileExists($v_File) Or FileGetSize($v_File) <> $vMapFilesArray[$z][1] Then _
    Return 1
    Next

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

    Return 0
    EndFunc ;==>_SM_Check4MapFiles

    [/autoit]
  • Okay ich muss zugeben, da blick ich nicht ganz durch :D

    Könntest du mir mal auf auf die Sprünge helfen, vll steh ich nur aufm Schlauch :D

  • Also ich hab soviel herausgefunden, dass auch im Explorer die Endgröße der Datei sofort angezeigt wird...
    Also werde ich wohl über den Dateigrößenvergleich nicht weiterkommen :(

    Was mir spontan noch einfällt wäre es evtl. möglich die aktuellen Dateizugriffe auszulesen?

  • Problem gelöst!!

    Ich habs mit dem Auslesen der Zeilen der Zieldatei hinbekommen!
    Solange noch kopiert wird kommt durchgehend 0 raus :)

    Also sobald $AnzahlZeilen > 0 ----> Leglos =)

    Danke für eure Unterstützung!!!