[HELP] FileOpen / FileReadLine

  • Moin leute,

    hab ein problem welches mich tierisch nervt... -.-

    also, ich will ein kleinen Script schreiben der drauf reagiert wen was in einem messenger geschribenen wird, welcher dies ist etc spielt überhaupt keine rolle der punkt ist,
    der Script basiert darauf das er die letzte zeile des chatlogs liest und diese in ner variable packt sollte die letze zeile "blablabla" lauten reagiert er (zuerstmal nur ne MsgBox als test)

    [autoit]


    #include <LineCounter.au3>

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

    While 1

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

    $log = "...........txt"
    $last_line = LineCounter($log, 1)

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

    $file = FileOpen($log, 1)
    $read = FileReadLine($file, $last_line)
    FileClose($file)

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

    If $read = "thecode" Then
    MsgBox(0, "meinText", "meinText")
    EndIf

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

    WEnd

    [/autoit]

    JEDOCH ist mein problem dieser, das sobald der Script am laufen ist, das sich die chatlog txt datei nicht mehr weiter schreibt !!! ich dachte ich close mal das File also mit dem befehl FileClose aber NEIN der schreibt sich immer noch niht weiter!!!!!

    ich hoffe mir kann jemand helfen, währe auch sehr dankbar

    Mfg

    Einmal editiert, zuletzt von b0tnet (25. März 2010 um 19:42)

  • 1. FileOpen($log, 0) - Du willst ja nur lesen.
    2. Du kannst es auch ohne FileOpen und FileClose ausprobieren
    3. Dieser Schleife würde ein Sleep nicht schaden.

  • Moin

    FileOpen($log, 0) sperrt den zugriff auf die Datei also kann kein anderes program (ok mit hooking gehts aber darauf will ich ned eingehen) sie verändern. Damit wäre dein Prob gelöst, und wenn du ned willst das dein Programm dir CPU wie gestört frisst machn Sleep(1) oder bei dir würd auch ein Sleep(100) locker reichen, muss ja nicht etwas sein wo extrem schnell reagieren soll ;)

    mfg

  • @Filin

    1. Ja das war ein versehen das ich es mit 1 gespostet habe weil hatte vorher 0 und habe es jezt auch mit 0 probiert, genau das gleiche
    2. habe jezt mal versucht die 2 raus zu nehmen und so gestaltet -> $read = FileReadLine($log, $last_line) kann zwar die datei lesen aber genau das gleiche problem, nicht beschreieben beim chatten
    3. habe auch jezt versucht ein sleep einzufügen nach dem $read = FileReadLine($log, $last_line) so etwa 3 sekunden mal und da los gechatet aber es hatt die datei wieder nicht beschrieben !!!!!

    -........-

    aber vielen dank für deine bemühung !!!

  • Moin

    FileOpen($log, 0) sperrt den zugriff auf die Datei also kann kein anderes program (ok mit hooking gehts aber darauf will ich ned eingehen) sie verändern. Damit wäre dein Prob gelöst, und wenn du ned willst das dein Programm dir CPU wie gestört frisst machn Sleep(1) oder bei dir würd auch ein Sleep(100) locker reichen, muss ja nicht etwas sein wo extrem schnell reagieren soll ;)

    mfg

    Womit wäre das problem gelöst....?!?! ^^ sry... :whistling:

    ...danke

  • Ich machs einfach mal ^^ :P

    EDIT 1: kleinen fehler gemacht :P

    [autoit]

    #include <LineCounter.au3>

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

    Local $log,$last_line,$read

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

    While 1
    Sleep(100)
    $log = "...........txt"
    $last_line = LineCounter($log, 1)
    $read = FileReadLine($log, $last_line)
    If $read = "thecode" Then
    MsgBox(0, "meinText", "meinText")
    EndIf
    WEnd

    [/autoit]
  • Genau, so würde ich jezt auch KARKEIN problem sehen aebr trozdem schreibt sich die TXT nicht mehr weiter wen sie abgefragt wird...
    also es handelt sich hierbei um QIP 2005, vll probieere ich mal ICQ statt QIP

    muss wohl andem liege...

    aber riesen dank !

  • nein das liegt am script.
    Die Funktion LineCounter kenn ich nicht, hab ich mir damals immer selber gemacht.
    Wenn du es nicht schaffst mach ich dirn funktionierendes Script ;)

  • Hallo botnet,

    ...
    Genau, so würde ich jezt auch KARKEIN problem sehen aebr trozdem schreibt sich die TXT nicht mehr weiter wen sie abgefragt wird...
    also es handelt sich hierbei um QIP 2005, vll probieere ich mal ICQ statt QIP

    muss wohl andem liege...

    aber riesen dank !

    dann poste doch dein komplettes Skript, oder sollen noch mehr Leute ihre Glaskugel befragen,

    mfg (Auto)Bert

  • nein das liegt am script.
    Die Funktion LineCounter kenn ich nicht, hab ich mir damals immer selber gemacht.
    Wenn du es nicht schaffst mach ich dirn funktionierendes Script ;)

    Line Counter hab ich mal vom net geholt

    [autoit]


    #cs -------------------------------------
    LineCounter made by Jakolo

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

    Funktion: Der LineCounter Zählt die Linien in einer Text Datei.
    Es muss der Wert $sFile (der Dateipfad zur Text Datei)
    angegeben weden. Der Wert $iOption (0 [Standart] leere
    Zeile werden nicht mitgezählt | 1 leere Zeilen werden
    mitgezählt)ist optional.

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

    Beispiel:LineCounter ($sFile,$iOption)
    LineCounter (@ScriptDir & "\Test.txt",1)

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

    #ce -------------------------------------

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

    Func LineCounter($sFile,$iOption = 0)
    $File = FileOpen($sFile,0)
    $count = 0
    While 1
    $Read = FileReadLine($File)
    If @error = -1 Then ExitLoop
    If Not $iOption = 1 Then
    If $Read = "" Then ContinueLoop
    EndIf
    $count = $count +1
    WEnd
    Return $count -1
    EndFunc

    [/autoit]

    jezt wo du es sagst oO es muss daran liegen !!!!!

  • Ja is mir klar warum, guckmal:

    [autoit]

    Func LineCounter($sFile,$iOption = 0)
    $File = FileOpen($sFile,0)
    $count = 0
    While 1
    $Read = FileReadLine($File)
    If @error = -1 Then ExitLoop
    If Not $iOption = 1 Then
    If $Read = "" Then ContinueLoop
    EndIf
    $count = $count +1
    WEnd
    Return $count -1
    EndFunc

    [/autoit]


    da gibs schonwieder ein FileOpen, ich ändere deine UDF ma in das hier:

    [autoit]

    Func LineCounter($File,$iOption = 0)
    $count = 0
    While 1
    $Read = FileReadLine($File)
    If @error = -1 Then ExitLoop
    If Not $iOption = 1 Then
    If $Read = "" Then ContinueLoop
    EndIf
    $count = $count +1
    WEnd
    Return $count -1
    EndFunc

    [/autoit]

    Viel Spass, jetzt funktioniert es ;)

  • Ich habe jetzt einwenig mit Notepad rumgespielt: der will auch nichts speichern, wenn der Skript läuft. Mit einem Sleep in der Schleife funktioniert es aber.

    Spoiler anzeigen
    [autoit]

    While 1
    $log = 'a.txt'
    $lines = FileRead($log)
    $lines = StringSplit($lines, @CRLF)
    $read = ''
    For $i = $lines[0] To 1 Step -1
    If $lines[$i] <> '' Then
    $read = $lines[$i]
    ExitLoop
    EndIf
    Next
    If $read = "thecode" Then
    MsgBox(0, "meinText", "meinText")
    EndIf
    Sleep(1000)
    WEnd

    [/autoit]
  • Wozu selbst machen oder aus dem Internet holen, wenn sie sowieso schon implementiert ist? ;)

    [autoit]

    _FileCountLines

    [/autoit]

    Da ist sicher auch ein FileOpen drinnen also rahte ich davon ab!

  • Hallo botnet,

    Zitat von Detsche Hilfe zu FileReadLine

    FileReadLine

    Liest eine Textzeile aus einer zuvor geöffneten Textdatei.

    FileReadLine ( "filehandle/filename" [, line] )

    Parameter

    filehandle/filename Das Handle der Datei, wie es von einem früheren Aufruf von FileOpen zurückgegeben wurde. Alternativ kann ein String mit dem Dateinamen als erster Parameter verwendet werden.
    line [optional] Die Zeilennummer, die gelesen werden soll. Die erste Zeile einer Textdatei hat die Nummer 1 (nicht 0). Die letzte Zeile ist -1.

    du kannst also dein Skript so schreiben:

    [autoit]

    #include <LineCounter.au3>

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

    Local $log,$last_line,$read

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

    While 1
    Sleep(100)
    $log = "...........txt"
    $read = FileReadLine($log, -1)
    if @error then
    MsgBox(16,"Fehler","kann nicht aus Datei lesen")
    else
    ConsoleWrite($Read & @crlf) ;gibt zum testen die komplette Zeile in der Scite-Konsole aus
    If $read = "thecode" Then ;steht das denn auch wirklich in der Zeile???
    MsgBox(0, "meinText", "meinText")
    EndIf
    EndIf
    WEnd

    [/autoit]

    mfg (Auto)Bert

  • @K1773R

    ich weis beim besten willen nicht woran es noch liegen könnte, aber es funktioniert nicht O_____O