_FileCountLines vereinfachen

  • Guten tag,

    Ich möchte überprüfen, ob eine neue Zeile in einer Textdatei hinzugekommen ist, wenn ja dann soll er in die Funktion gehen.
    Ich habe folgendes:

    Spoiler anzeigen
    [autoit]

    While 1
    sleep(100)
    $Count1 = _FileCountLines($Dateipfad)
    If $Count1 > $Count2 Then _func()
    $Count2 = _FileCountLines($Dateipfad)
    WEnd

    [/autoit]

    Ganz in Ordnung das Teil, jedoch funktioniert es nicht immer, denn es funktioniert nur, wenn eine neue Zeile hinzugekommen ist und das Programm gerade im sleep ist. Oftmals passiert es aber bevor Count2 die Zeilen ausliest. Dann macht das programm nämlich nichts. Wie könnte man das vereinfachen?

    mfg

  • Also ich hba mal so was ähnliches gremascht allerdings hab ich einfach nur überprüft ob die Datei verändert wurde.
    Code:

    Spoiler anzeigen
    [autoit]


    $Filepfad = "test.txt"
    $AktuelleDatei = FileGetTime ($FilePfad,0,1)
    $Aktuallisierungszeit = 1000
    $StarteTimer = 0

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

    While 1
    if TimerDiff($StarteTimer) > $Aktuallisierungszeit then
    $StarteTimer = TimerInit()
    CheckFile()
    EndIf
    Sleep(50)
    WEnd

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

    Func Checkfile()
    $CheckDatei = FileGetTime ($FilePfad,0,1)
    if $CheckDatei <> $AktuelleDatei then
    MsgBox(0,"","Datei wurde verändert.")
    $AktuelleDatei = FileGetTime ($FilePfad,0,1)
    EndIf
    EndFunc

    [/autoit]
  • Könntest es so machen:

    [autoit]

    $Countstart = _FileCountLines($Dateipfad)
    While 1
    $CountNeu = _FileCountLines($Dateipfad)
    If $CountNeu > $CountStart Then
    $countStart = $countNeu
    _func()
    EndIf
    sleep(100)
    WEnd

    [/autoit]
  • Ist aber schwachsinn und was ist wenn zeile x durch zeile y ersetzt wurde? Dann erkennt er es nicht.

  • Wichtig ist mir die Geschwindigkeit aufjedenfall. Da wäre die Lösung mit FileGetSize ganz ok. Aber wie mach ich es dann, dass er dann die letzte Zeile der File ausliest? Mit FilecountLines wusste ich ja dann sofort, welche zeile hinzugefügt wurde. Somit müsste ich mir die letzte Zeile ja wieder abzählen lassen.

  • Oder Du sparst Dir _FileCountLines komplett.
    Erst wie Peethebee sagte den Test durchführen, und wenn Du dann die letzte Zeile willst, einfach zeilenweise auslesen. Wenn dann EOF, die letzte noch gelesene Zeile benutzen.

    z.B. so :

    Spoiler anzeigen
    [autoit]

    $hFile = FileOpen ("myfile.txt",0)
    MsgBox (1, "LastLine", "Letzte Zeile ist: " & @CR & _ReadLastLine ($hFile))
    FileClose ($hFile)
    Exit

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

    Func _ReadLastLine ($hFile)
    while 1
    $sTemp = FileReadLine ($hFile)
    If @error <> - 1 Then
    $sLastLine = $sTemp
    Else
    Return $sLastLine
    EndIf
    If @error <> 0 Then
    MsgBox (1, "Error", "Unexpexted Error occured " & @error)
    Return @error
    EndIf
    WEnd
    EndFunc

    [/autoit]

    Gruß,

    TrueMu