Hi,
ich habe ein Script was fertige TV Aufnahmen vom TV-Server auf meinen Arbeitsrechner verschiebt sobald beide Rechner gleichzeitig an sind. Leider lastet das normale Filemove dabei das Netzwerk und (komischerweise) den Arbeitsrechner dermaßen aus das ein weiterarbeiten während des Kopierens fast unmöglich ist. Wenn sich wieder einmal, so wie jetzt, mehrere Gigabyte angesammelt haben ist hier erstmal für längere Zeit Pause angesagt.
Daher die Frage, kennt jemand eine Möglichkeit die Kopiergeschwindigkeit zu drosseln?
Wenn nicht per AutoIt, dann von mir aus auch über Batch. Ungerne nehme ich auch Hinweise über 3.Party Anwendungen entgegen in die ich mich erst wieder einarbeiten muss (rsysnc?).
Danke
Kopiergeschwindigkeit drosseln
-
- [ gelöst ]
-
Gofel -
21. November 2014 um 22:52 -
Erledigt
-
-
Du kannst ja die Datei öffnen und schrittweise die Daten einlesen. So kannst du auch die Kopiergeschwindigkeit bestimmen.
-
Klingt interessant, hättest du ein Beispiel für mich wie man Daten schrittweise einliest?
Ich hab nämlich keine Idee wie das gehen soll.Edit: Bisher hab ich das hier auf die Reihe bekommen:
Code
Alles anzeigen$File = @ScriptDir & "\a.mpg" $FileZiel = @ScriptDir & "\b.mpg" $oFile = FileOpen($File,4) $Line = FileRead($oFile) While 1 $Block = StringLeft($Line, 1000000) If $Block = "" Then ExitLoop FileWrite( $FileZiel, $Block) $Line = StringTrimLeft($Line, 1000000) Sleep(1000) WEnd
Ein normales Filemove dauert mit dieser Testdatei ca 3 Sekunden. Mit Filewrite schon ohne das Sleep ca 20 Sekunden. Sieht schrecklich ineffektiv aus, aber könnte genau das sein was ich in diesem Fall brauche. Ich probier das morgen mal im Netzwerk aus, danke
-
Irgendwoher hab ich mal aus diesem Forum ein Script gefunden, weiss aber den Link dazu nicht mehr oder wer dieses Script geschrieben hat.
[autoit]#RequireAdmin
[/autoit][autoit][/autoit][autoit]
;~ $Quelle = @SystemDir & '\taskmgr.exe'
;~ $Ziel = "C:\taskmgr.exe"
If _ProgressCopy($Quelle, $Ziel) Then MsgBox(0,"", "Kopiervorgang erfolgreich!")Func _ProgressCopy($SourceFile, $DestinationFile)
[/autoit]
If Not FileExists($SourceFile) Then Return SetError(1,1,0)
If $SourceFile == $DestinationFile Then Return SetError(2,2,0)
#region------------------------------------Declare Variables-------------------------------
Local $ByteBlock, $Counter
Local Const $BlockSize = Int(FileGetSize($SourceFile) / 99)
Local Const $Opt = Opt("GUIOnEventMode", 0)
Local $OpenHandle = FileOpen($SourceFile, 16)
Local $WriteHandle = FileOpen($DestinationFile, 26)
#endregion---------------------------------------------------------------------------------
If $OpenHandle = -1 Or $WriteHandle = -1 Then Return SetError(3,3,0)
#region------------------------------------GUI create--------------------------------------
Local $GUI = GUICreate('', 400, 105, Default, Default, 0x80880000)
Local $Label1 = GUICtrlCreateLabel($SourceFile, 8, 10)
Local $Label2 = GUICtrlCreateLabel($DestinationFile, 8, 30)
Local $Label3 = GUICtrlCreateLabel("0%", 360, 25, 30, 20, 0x2)
Local $Button = GUICtrlCreateButton("Abbrechen", 160, 75, 80)
Local $PBar = GUICtrlCreateProgress(8, 50, 384, 20)
GUISetState()
#endregion---------------------------------------------------------------------------------
#region----------------------------------Copy File-----------------------------------------
Do
$ByteBlock = FileRead($OpenHandle, $BlockSize)
If @error Then ExitLoop
FileWrite($WriteHandle, $ByteBlock)
$Counter += 1
GUICtrlSetData($PBar, $Counter)
GUICtrlSetData($Label3, $Counter & ' %')
If GUIGetMsg() = $Button Then
Opt("GUIOnEventMode", $Opt)
FileClose($OpenHandle)
FileClose($WriteHandle)
GUIDelete($GUI)
FileDelete($DestinationFile)
Return SetError(4,4,0)
EndIf
Sleep(20) ;Bremse - Auskommentieren für maximale Geschwindigkeit
Until 0
#endregion---------------------------------------------------------------------------------
Opt("GUIOnEventMode", $Opt)
FileClose($OpenHandle)
FileClose($WriteHandle)
GUIDelete($GUI)
Return 1
EndFunc -
Sehr schön, natürlich viel eleganter als mit Trim rumzueiern. leider versteh ich nicht warum es funktioniert
Die Schleife durchläuft:$BlockSize ist doch aber eine Konstante, nach meinem Verständnis wird hier immer wieder der selbe Teil von $OpenHandle in $ByteBlock eingelesen.??
Wie auch immer, sobald ich das verstehe verwende ich diese Variante. Danke auch dir.
-
Zitat
$BlockSize ist doch aber eine Konstante, nach meinem Verständnis wird hier immer wieder der selbe Teil von $OpenHandle in $ByteBlock eingelesen.??
Nein eben nicht. Wenn du dir das Beispiel zu fielread in der Hilfe anschaust wirst du sehen, dass bei jedem erneuten Lesen aus der noch offenen Datei immer die nächsten X Zeichen/Byte gelesen werden solange bis fileread einen Fehler meldet (End of file). Das funktioniert allerdings nur wenn man mit filehandles (fileopen) arbeitet und die Datei "geöffnet" bleibt. Sobald die Datei geschlossen wird (fileclose) werden zukünftige Leseversuche wieder beim ersten Zeichen/Byte anfangen. Bedeutet also wenn man statt einem Handle einen Dateipfad an fileread in der Schleife übergibt kann man so tatsächlich immer nur den gleichen Anfangsteil auslesen, da fileread in diesem Fall automatisch ein fileopen und fileclose durchführt.
-
Hatte heute keine Zeit zum schauen, aber danke für die Erklärung. So läßt sich eine schöne Lösung zum drosseln der Geschwindigkeit basteln.
Edit: Ich wollte nur nochmal Rückmeldung geben, die von bbm1995 gepostete Funktion ist in mein Script eingebaut und läßt sich ganz fein über das Sleep regulieren. Kommentiert man das Sleep ganz aus ist die Kopiergeschwindigkeit gleichwertig zu einem FileCopy, schönes Ding!