mein zweites problemchen am heutigen tage:
ich habe zwei dateien z.B. datei a und datei b.
datei a ist 1200000 bytes gross datei b immer etwas größer z.b 1240000 bytes.
ich möchte jetzt von datei b die differenz in einer dritten datei haben. also datei c -> 40000 bytes
welche befehle helfen mir weiter um das ganze CPU schonend durchzuführen ?
danke im voraus!
datei aufsplitten, aber wie ?
-
- [ gelöst ]
-
WhiteLion -
2. Juli 2010 um 00:30 -
Geschlossen -
Erledigt
-
-
Schau dir die Hilfe inkl. Beispiel zu
[autoit]FileSetPos
[/autoit]in der Hilfe an,
mfg (Auto)Bert
-
okey, anegegugut und mal folgendes zusammengepfuscht:
[autoit]#include <Constants.au3>
[/autoit][autoit][/autoit][autoit]$hFile = "test.txt"
[/autoit][autoit][/autoit][autoit]FileWriteLine($hFile, "Line1")
[/autoit][autoit][/autoit][autoit]
FileWriteLine($hFile, "Line2")
FileWriteLine($hFile, "Line3")$oldsize = FileGetSize($hFile)
[/autoit][autoit][/autoit][autoit]
MsgBox(0,"alte größe",$oldsize)FileSetPos($hFile, $oldsize, $FILE_BEGIN)
[/autoit][autoit][/autoit][autoit]FileWriteLine($hFile, "vvvvvvvvLine4")
[/autoit][autoit][/autoit][autoit]
FileWriteLine($hFile, "vvvvvvvvLine5")$newsize = FileGetSize($hFile)
[/autoit][autoit][/autoit][autoit]
MsgBox(0,"neue größe",$newsize)$difference = $newsize-$oldsize
[/autoit][autoit][/autoit][autoit]
MsgBox(0,"unterschied",$difference)FileDelete($hFile)
[/autoit]na ja, die differenz die ich haben wollte bekomme ich ja nun raus ....
allerdings frage ich mich, mit welchem befehl ich genau die differenz
auslesen kann .... ich habe keinen befehl gefunden bei dem ich ab byte x lesen kannEDIT: ich weise nochmal draufhin, dass ich hier nur beispielhaft eine text-datei erstellen lassen.
ich brauche also einen befehle mit dem ich ab byte x lesen lassen kann, auch wenn es eine
binärdatei ist. -
FileRead ließt ab der aktuellen Position, die du mit FileSetPos veränderst
Spoiler anzeigen
[autoit]$sFile1 = @DesktopDir & "\test1.txt"
[/autoit] [autoit][/autoit] [autoit]
$sFile2 = @DesktopDir & "\test2.txt"
$sFileOut = @DesktopDir & "\test_out.txt";~ #cs
[/autoit] [autoit][/autoit] [autoit]
;-----------------------------------------------------------
#Region TESTDATEN
$sContent1 = "test" & @CRLF & "noch was"
$hFile = FileOpen($sFile1, 2)
FileWrite($hFile, $sContent1)
FileClose($hFile)$sContent2 = $sContent1 & " zusätzliches"
[/autoit] [autoit][/autoit] [autoit]
$hFile = FileOpen($sFile2, 2)
FileWrite($hFile, $sContent2)
FileClose($hFile)
#EndRegion TESTDATEN
;-----------------------------------------------------------
;~ #ce$iSize1 = FileGetSize($sFile1)
[/autoit] [autoit][/autoit] [autoit]
$iSize2 = FileGetSize($sFile2)
$iSizeDiff = $iSize2-$iSize1$hFile = FileOpen($sFile2, 16)
[/autoit] [autoit][/autoit] [autoit]
$hFileOut = FileOpen($sFileOut, 18)FileSetPos($hFile, $iSize1, 0) ; An die Position setzen
[/autoit] [autoit][/autoit] [autoit]
While 1 ; in Blöcken kopieren, damit weniger Arbeitsspeicher verbraucht wird
$bData = FileRead($hFile, 10240) ; ein Block mit 10 Megabyte
If @error Then ExitLoop
FileWrite($hFileOut, $bData)
WEndFileClose($hFileOut)
[/autoit]
FileClose($hFile) -
klasse das script scheint zu funktionieren, dennoch habe ich ein problem dessen ursache ich nicht finde.
also ich lasse mit einer kleinen funktion die differenz von einem logfile auslesen was ständig wächst....
und zwar nachdem ich was in eine console geschrieben hatte um so die ausgabe im difference.log habe um
diese zu analysieren. - das klappt auch wenn der server das logfile recht langsam beschreibt, sobald ich aber
massives ansteigen des schreibens in das logfile verzeiche, dann hängt sich bei anwendung
meiner funktion das log kompett auf ...also die originale server.log - datei lässt sich dann sogar manuell mit dem editor
nicht mehr öffnen. - stimmt was mit meiner funktion nicht ?(mit massivem schreiben meine ich, dass das log um ca. 0,5 MB pro minute wächst.)
EDIT: ich habe herausgefunden das der fehler in meiner (dieser) Funktion liegen muss, allerdings habe ich keine ahnung wieso
[autoit]
auf jeden fall freezt sie die zweite datei aus der die differenz extrahiert wird .... auch bei kopien von dem log. wo ist mein fehler ?
[/autoit][autoit][/autoit][autoit]
_copydifference(server.log, copyolderofserverlog.log, difference.log)Func _copydifference($sourcefile1, $sourcefile2, $differencefile)
[/autoit][autoit][/autoit][autoit]
FileDelete($difference)
$sourcefileOut = FileOpen($differencefile, 18)
$oldsize = FileGetSize($sourcefile1)
;MsgBox(0,"alte größe",$oldsize)FileSetPos($sourcefile1, $oldsize, $FILE_BEGIN)
[/autoit][autoit][/autoit][autoit]$newsize = FileGetSize($sourcefile2)
[/autoit][autoit][/autoit][autoit]
;MsgBox(0,"neue größe",$newsize)$difference = $newsize-$oldsize
[/autoit][autoit][/autoit][autoit]
;MsgBox(0,"unterschied",$difference)$newfile = FileOpen($sourcefile2, 16) ; 16 = binärmode
[/autoit][autoit][/autoit][autoit]
FileSetPos($newfile, $oldsize, 0)While 1
[/autoit][autoit][/autoit][autoit]
$bData = FileRead($newfile, 10240)
If @error Then ExitLoop
FileWrite($sourcefileOut, $bData)
WEndFileClose($sourcefileOut)
[/autoit][autoit][/autoit][autoit]
FileClose($sourcefile1)
FileClose($sourcefile2)EndFunc
[/autoit] -
- Offizieller Beitrag
In Zeile 17 öffnest Du die Datei $sourcefile2 und bekommst das Handle $newfile. Das benutzt Du dann auch zum lesen (richtig), aber am Ende der Funktion schließt Du $sourcefile2 (falsch). Das muss FileClose($newfile) heißen.
-
Die Zeile 9 ist auch unnötig. Das ist falsch und wird auch nicht benötigt.
[autoit]FileSetPos($sourcefile1, $oldsize, $FILE_BEGIN)
[/autoit] -
danke jetzt hab ichs