Erfolg bei FileMove

  • hi,

    in meinem Script habe ich ein FileMove drin. Damit werden drei bis vier Dateien mit einer Gesamtgröße von ca. 6-8 GB von einem Server zum anderen Server verschoben. (1GB/s Anbindung). Das FileMove läuft hierbei sehr langsam ca. 1h. Damit das Script danach noch eine abschließende Func ausführen kann habe ich das FileMove so aufgebaut.

    [autoit]

    If FileMove("D:\Backup\*.*", "T:\Datensicherung", 1) = 1 Then

    [/autoit]


    Doch leider ist das Script schon früher beendet bevor Filemove den Erfolg meldet. Auch kommt es vor das der erfolg "eigentlich "gemeldet wird aber die anschliessende Func nicht kommt. Woran liegt es?

    Mfg Taucher ;(

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Hi!

    Erstmal : Meines erachtens wäre der Richtige Syntax:
    FileMove("D:\Backup\*.*", "T:\Datensicherung\", 1) ; also mit \ am ende.

    Ansonsten poste bitte mal alles :)

  • hi,

    sorry habe ich hier beim schreiben vergessen das "\" ist drinnen

    taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag

    @Aspirin:
    Das bezieht sich so wie ich das lese auf den internen Ablauf. FileMove macht also Copy und Delete statt die API zum Verschieben aufzurufen. Code sollte also so passen.

    @Threadstarter:
    Kannst du vllt. mit FileExists oder FileGetSize arbeiten? Evtl. auch mit AdlibEnable immer testen - solange, bis die neue Datei die gleiche Größe hat wie die alte hatte.

    peethebee

  • hi,

    gut ich versuche es heute Abend mal erst mit FileCopy.

    peethebee
    Beim FIleMove hatte es den Anschein, das gleich die gesamte Größe angezeigt wird. Jedenfalls wenn man mit den Windowsmitteln das beobachten möchte. In meinem Fall ist die erste Datei ca 2,09 GB groß. Dieses wird sofort auf der Kopierenden Seite sowie auf der Einfügenden Seite angezeigt. Wie sollen dann FileGetSize funktionieren. Kannst du ein Beispiel zeigen was das AdlibEnable genau veranstaltet?

    [autoit]

    If Not FileExists($FTP) Then
    DriveMapAdd("T:", "\\Server\Backup")
    MsgBox(64, "Laufwerk", "Es wurde " & $FTP & " verbunden", 10)
    EndIf
    ;
    If FileExists("D:\Backup\" & "*.fbk") Then
    $begin = TimerInit()
    If FileMove("D:\Backup\*.*", "T:\Datensicherung\", 1) = 1 Then
    $dif = TimerDiff($begin)
    $dif = $dif / 60000
    FileWriteLine($PROTFILE, "Die erstellte Datensicherung wurde in " & Round($dif, 1) & " Minuten verschoben" & @CRLF)
    Sleep(1500)
    _mail()
    Sleep(2500)
    Else
    _Hinweis()
    ProcessClose("fin.exe")
    EndIf
    EndIf

    [/autoit]


    Das Script steuert ein anders Programm.
    Taucher

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • hi,

    so nun ist es zweimal nachts gelaufen. Einmal ging es mit FileCopy gut und einmal ging es schief. Was mir noch aufgefallen ist das ich in meinem Script es so stehen habe

    [autoit]

    FileMove("D:\Backup\*.*", "T:\Datensicherung\", 1) = 1

    [/autoit]

    damit habe ich eine Kopierzeit von gut 60 min. Wenn ich es so Ändere

    [autoit]

    FileMove("D:\Backup\*.fbk", "T:\Datensicherung\", 1) = 1

    [/autoit]

    reduziert sich die Zeit auf ca.15 min. Woran liegt es ? In diesem Ordner liegen nur Dateien die die Endung .fbk haben.
    Hat wer noch ne Idee was man Ändern kann?

    MFG Taucher ;(

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Hallo!

    wie läuft das Script?? mir ist nämlich schleierhaft, wie Dein Laufwerk verbunden werden soll, wenn das nicht da ist. Läuft das als geplanter Task oder als Dienst, dann kann ich mir das Problem schon denken. (nach Deiner Machart muß das ein aufgeschalteter User mit verbundenem T: benutzen, hab mir Dein $FTP versucht nachzubauen).


    Hab so ca. 20 Kopiertools mit autoit bei uns im Rechenzentrum laufen und die laufen echt gut, aber immer ne saubere Schleife drum rum (als FileFindFirstFile) oder wie unten im Beispiel.
    Meine _protoutput ist sicher nicht die Lösung um die Endgeschwindigkeit des Kopierens zu messen, nützt mir in der Praxis auch nichts, da entscheidend ist, wann ist die Datei A vom Server1 auf den Server2 gewandert.


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

    ; test_57.au3
    ; kopieren Muster für Usergroup

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

    #include <Date.au3>
    #include <string.au3>
    #include <file.au3>
    #include <array.au3>

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

    $PROTFILE="F:\hilf\test_57.prot"

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

    $FTP="\\gddp1\cd"
    $source_path="F:\quelle"
    $dest_path="T:\nix"

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

    If Not FileExists($FTP) Then
    DriveMapAdd("T:", "\\GDDP1\CD")
    MsgBox(64, "Laufwerk", "Es wurde " & $FTP & " verbunden", 10)
    EndIf
    ;

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

    $FolderList=_FileListToArray($source_path & "\", "*.fbk",1) ; Flag 2 = nur Ordner

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

    If (Not IsArray($FolderList)) OR @ERROR > 0 Then
    _protoutput($PROTFILE," keine Dateien zum kopieren vorhanden")
    ; MsgBox (0,"","Keine Dateien gefunden gefunden.")
    else

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

    For $i = 1 To $FolderList[0]

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

    $Befehl=FileMove($source_path & "\" & $FolderList[$i],$dest_path & "\" & $FolderList[$i],2)
    if $Befehl=1 then
    _protoutput($PROTFILE, "Datei " & $FolderList[$i] & " erfolgreich kopiert")
    else
    _protoutput($PROTFILE, "FEHLER bei Datei " & $FolderList[$i])
    EndIf
    sleep (250) ; mit dem Wert spielen, mindestens auf 30 lassen, sonst ist die CPU-Last auf 100%

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

    Next

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

    EndIf

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

    Func _protoutput($PROTFILE,$TEXT)

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

    $datelong = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC

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

    $pfile=Fileopen($Protfile,1)
    ; Check if file opened for reading OK
    If $pfile = -1 Then
    MsgBox(64, "PROTOKOLLDATEI" & " " & $PROTFILE, "kann nicht geöffenet werden",10)
    Exit
    EndIf

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

    FileWrite($pfile, $datelong & " " & $TEXT & @CRLF)

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

    FileClose($pfile)

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

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • hi

    kenn mich mit dem Serverzeug nicht all zu gut aus... aber wäre es nicht am einfachsten, mit autoit eine cmddatei zu erstellen und den Output von zu cmd prüfen, ob das kopieren schon abgeschlossen ist (nach meiner Erinnerung 'hängt' sich ja cmd auf wenn eine große Datei kopiert wird bis der Kopiervorgang abgeschlossen ist)?


    grez

  • warum soll ich da mit ner CMD-Umgebung Arbeiten, die Meldungen aus Autoit (=funktionsmeldungen von FileCopy oder FileMove) sind schon OK. Auf Terminalservern kann folgendes Geisterprobem auftreten:
    die Datei ist schon von Funktion a geschrieben, wenn ich aber ohne Pause von Funktion b drauf zugreifen will, dann hustet der mir was (der Cache schreibt das anscheinend noch runter) da hab ich immer ne Pause von 5 Sekunden drin.

    Kann mir 2 Sachen vorstellen:
    sind im Quellverzeichnis viele Dateien, dann dauert das Abarbeiten (Viele sind für mich hier sagen wir mal > 15000 Stück, das bremst tierisch)

    wenn da noch (von irgendeinem anderen Prozess Daten reingeschrieben werden und ich will die schon weggkoperen oder -moven dann hab ich auch ein Problem, hier kann man aber einfach mit Autoit abfragen, ob der letzte Zugriff auf die Datei > 20 Sekunden war (das ist mein Richtwert in Multiserverumgebungen für Dateien zwischen 3kb und 20kb, wenn ich nur 1kb große Dateien habe, dann stell ich das auf 5 Sekunden.
    (Mustercode gibts bei Interesse).

    Schaufe den ganze Tag wirklich unmengen von Zeugs von A nach B (allerdings so immer unter 500kByte) zwischen NetOp-Systemen, Samba, div. MS-Kisten).

    Brauch da jetzt mal etwas mehr Futter:
    a, wieviele Dateien stehen im Quellverzeichnis
    b, werden da von einem anderen Prozess Daten noch reingeschrieben, während ich kopieren will
    c, wie stark ist die Kiste ausgelastet (kann man mit glint=Freeware und erste Sahne dafür -funktioniert ohne Installation sehr gut und sehr detailliert abfragen)
    d, hat Taucher (war doch der Ursprungsfrager) schonmal meinen Code ausprobiert
    e, ist die Kiste evtl. tierische fragmentiert (kenn da so einen der hat seinen Server noch nie Defragmentiert, nach 5 jahren war seine 5GB große Datenbank auf 87000 Fragmente verteilt), dadurch hatte ich 2 sehr ruhige Tage (wo nix mehr geht, geht nix mehr äh absolut nix mehr)

    Also raus mit der Sprache, Autoit läuft im Serverumfeld einwandfrei, sonst hätten mich heute wieder 150 Kunden gefressen --)))

    Grüße

    German