(FileRead count Problem) Diesmal will ich wissen ob kb/s rechnung stimmt

  • Hallo Liebe AutoIt-Community,

    Ich habe ein Problem mit FileRead.
    Ich möchte nur eine Bestimmte anzahl an Byte (um genau zu sein 1024) aus einer Datei lesen, soweit so gut, kann man ja ganz einfach als Parameter eingeben, doch dann brauche ich wieder die nächsten 1024 Bytes. Allerdings kann ich bei FileRead ja keinen Startpunkt angeben :(

    Wie kann ich das also lösen?
    Und alles einzulesen und dann zu Splitten geht bei Großen Dateien ja auch nicht denn dann ist ja die memory überfordert

    THX im voraus an alle

    mfg. Jam00

    12 Mal editiert, zuletzt von Jam00 (8. Oktober 2009 um 10:11)

  • Kann man so auch aus einer Datei heraus lesen, wenn diese immer wieder neue Daten bekommt. Daten werden immer ans Ende der Datei geschrieben. Log-Datei und die soll von oben nach unten im laufenden Log-Betrieb eingelesen werden.

    Geht das damit ?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Alina, das kommt darauf an, wie das andere Programm die Logdatei schreibt.
    Wenn die Datei während des gesamten Ablaufs gelockt ist, dann geht das nicht. Andernfalls kannst Du die Datei auslesen. Wenn Du allerdings vorhast die Datei häppchenweise auszulesen, solltest Du vorher ein Kopie davon anlegen und diese dann auslesen.

  • Ich hab nur das was Oscar mir gesagt hat angewand, das geht auch, aber ich hab hiermit ein Problem:

    Spoiler anzeigen
    [autoit]

    $File = FileOpenDialog ("Wähle die Datei aus",@DesktopDir,"Alle Dateien (*.*)")
    $Save = FileSaveDialog ("Wo soll die Datei gespeichert werden?",@DesktopDir,"(*." & StringTrimLeft ($File,StringInStr($File,".",0,-1)) & ")")
    If StringInStr ($File,"." & StringTrimLeft ($File,StringInStr($File,".",0,-1))) Then $Save &= "." & StringTrimLeft ($File,StringInStr($File,".",0,-1))
    $Open = FileOpen ($File,0)
    $Size = FileGetSize ($File)
    For $1 = 1 To $Size Step 1024
    If $1 - 1024 > $Size Then
    FileWrite ($Save,FileRead ($Open,$Size - FileGetSize ($Save)))
    Else
    FileWrite ($Save,FileRead ($Open,1024))
    EndIf
    Next

    [/autoit]


    Das soll für TCP-Send werden, will einen TCP-Datenübertragung schreiben, dafür muss ich es ja Splitten und das wollte ich erstmal ohne es gleich über tcp zu übertragen Probieren
    Mein Script geht bei Textdokumenten wunderbar aber bei nichts anderem :(
    Muss ich das Irgendwie noch mit Binary machen? Hab das auch schon mal Probiert, aber das wollte auch nicht so ganz

    Und nochmal THX im voraus an alle

    mfg. Jam00

    • Offizieller Beitrag

    Binärdateien musst Du mit Parameter "16" öffnen. Das gilt auch für das speichern.
    Habe Dein Script mal etwas abgeändert:

    Spoiler anzeigen
    [autoit]


    $File = FileOpenDialog("Wähle die Datei aus", @DesktopDir, "Alle Dateien (*.*)")
    $Save = FileSaveDialog("Wo soll die Datei gespeichert werden?", @DesktopDir, "(*." & StringTrimLeft($File, StringInStr($File, ".", 0, -1)) & ")")
    If StringInStr($File, "." & StringTrimLeft($File, StringInStr($File, ".", 0, -1))) Then $Save &= "." & StringTrimLeft($File, StringInStr($File, ".", 0, -1))
    $Open = FileOpen($File, 16)
    $OpenSave = FileOpen($Save, 16 + 2)
    $Size = FileGetSize($File)
    While True
    $Buffer = FileRead($Open, 1024)
    If @error Then ExitLoop
    FileWrite($OpenSave, $Buffer)
    WEnd
    FileClose($OpenSave)
    FileClose($Open)

    [/autoit]
  • Naja da war jemand schneller beim tippen...

    Normaler weise müsste es mit dem wie
    du es sagtes Binären gehen bsw. EXE Dateien und sonstiges
    zu lesen und schreiben, es muss aufjedenfall Binär sein, weil ohne
    das manche Zeichen nicht richtig gespeichert werden bzw. gelesen.

    So genau kenne ich mich damit nicht aus, hab aber mal füher sowas änliches wie du jetzt
    in VB5 geschrieben allerdings für COM Ports.

    auch mit übertragung von Dateien halt auch EXE usw...

    da gab es auch das problem das man beim übertragen dank des "Socket" Protocols ohne weiteres dies nicht
    übertragen konnte so hab ich vor dem übertragen alle Bytes einzel übersetzt in
    Hexadezimal Zahlen und danach wieder rückübersetzt. Das war zwar langsamer aber ging sehr gut...

    Alles gute...
    Mr.Script :thumbup:

  • Wenn $ms die Millisekunden die er am senden ist enthält znd $Size die Übertragene Bytezahl, ist diese rechnung in kb/s dann korrekt

    Spoiler anzeigen
    [autoit]

    $kb = ($ms / 60) / ($Size /1024)

    [/autoit]

    mfg. Jam00

    • Offizieller Beitrag

    So:

    [autoit]

    $kb = ($size / $ms) * 1000 / 1024

    [/autoit]


    Wenn $size Bytes übertragen werden und dafür die Zeit $ms in Millisekunden benötigt wird, dann muss man die Anzahl der Bytes durch die Anzahl der Millisekunden teilen, um auf Bytes je Millisekunde zu kommen. Danach mit 1000 malnehmen, um auf eine Sekunde zu kommen und dann durch 1024 teilen für KB.

  • jetzt wollte ich wissen, wie ich es mache, wenn ich z.B. 5mal mit FileRead($open,1024) aus einer datei gelesen habe wie kann ich dann nochmal 2048 zeichen zurückgehen, das ich wieder beim 3 mal lesen währe?

    mfg. Jam00

  • Ut, mir leid, das ich schon wieder Poste, aber es gibt in der Hilfe leider noch keinen Eintrag zu FileSetPos
    Bei SciTe gibt es eine kleine Popuphilfe, wo die Parameter drin stehen, (Handle, offset, origin), was Handle bedeutet ist ja klar, das ist ja $Open, aber was genau muss ich bei den anderen eintragen? Bei einem muss ich ja wohl die Psoition eintragen, aber bei welchem und was bei dem anderen? Kann nicht so gut Englisch :huh:

    mfg. Jam00

    • Offizieller Beitrag

    Ich habe Dir mal drei kleine Beispiele dazu geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    $hFile = FileOpen(@ProgramFilesDir & '\AutoIt3\Include\ChangeLog.txt', 16)
    If $hFile = -1 Then Exit

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

    $ret = FileSetPos($hFile, 1000, $FILE_BEGIN) ; setzt den Dateizeiger auf Position 1000 ab Anfang der Datei
    $read = FileRead($hFile, 10) ; 10 Bytes lesen
    ConsoleWrite(BinaryToString($read) & @CR)

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

    $ret = FileSetPos($hFile, -500, $FILE_CURRENT) ; setzt den Dateizeiger auf die Position 500 vor der momentanen Position
    $read = FileRead($hFile, 10) ; wieder 10 Bytes lesen
    ConsoleWrite(BinaryToString($read) & @CR)

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

    $ret = FileSetPos($hFile, -160, $FILE_END) ; setzt den Dateizeiger auf 160 Bytes vor dem Dateiende
    $read = FileRead($hFile, 10) ; wieder 10 Bytes lesen
    ConsoleWrite(BinaryToString($read) & @CR)

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

    FileClose($hFile)

    [/autoit]