Alle Zeilen aus einer Datei lesen

  • Huhu
    Ich brauche für eine Sicherheitsüberprüfung alle Zeilen aus einer Datei die auf meinem Server liegt. Ich habe es mit FileRead probiert(funktioniert nur die 1. Zeile o.O) und auch mit FileReadLine in einer For schleife was aber total daneben ging.
    Ich weis echt keinen anderen weg mehr wie ich mit möglichst einem Befehl alle Zeilen einer Datei auslesen lassen kann, und mit einem "Gegenstück" überprüfen kann.

    Könnt ihr mir helfen?

    Grüße

    Einmal editiert, zuletzt von Baaam (17. Januar 2011 um 18:50)

  • $file = FileRead("Datei")

    Gruß,
    UEZ

    [autoit]

    InetGet("http://......./serial.txt",@TempDir & "\serial.txt", 1, 0)
    $file = FileOpen(@TempDir & "\serial.txt", 0)
    $read = FileRead($file)
    FileClose($file)

    [/autoit]

    FUnktioniert immer noch nicht ...

  • Wird die Datei serial.txt überhaupt heruntergeladen?

    [autoit]


    $hDownload = InetGet("ftp://ftp.mozilla.org/README", @TempDir & "\Mozilla-README.txt", 1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hDownload = ' & $hDownload & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    InetClose($hDownload)
    $file = FileRead(@TempDir & "\Mozilla-README.txt")
    MsgBox(0, "Test", $file)

    [/autoit]


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich tippe auch eher auf ein Problem beim Downloaden.
    Kannst daher auch mal direkt die Datei aus dem Internet auslesen statt über eine temporäre Zwischendatei zu gehen:

    [autoit]

    $sFile = BinaryToString(InetRead( "ftp://ftp.mozilla.org/README", 1 + 2))
    MsgBox(0, "Test", $sFile)

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (17. Januar 2011 um 17:01)

  • kay beide Varianten gehn net
    ich schätze es liegt an der vergleichsmethode
    wenn ich einen wert mit dem ausgelesenen vergleiche aber im ausgelesenen nicht nur der wert selbst sondern noch 1 zweiter drin ist stört ihn das glaub ich

    [autoit]

    $sFile = BinaryToString(InetRead( "http://xxx/serial.txt", 1 + 2))
    If GUICtrlRead($CheckSerialInput) = $sFile Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    Exit 0
    EndIf

    [/autoit]

    Ich denke es liegt am = $sFile weil genau gleich isses ja net aber der Wert ist in der Datei vorhanden
    Ich hoffe habs jetzt richtig erklärt :/

    Weis jemand was?

  • Ich denke jetzt solltest du erstmal erklären was am Ende rauskommen soll dabei und wozu das ganze dient.
    Auf einmal vergleichst du hier den gesamten Dateiinhalt mit dem Inhalt eines Textfeldes.
    So wie ich das verstanden habe willst du wissen ob ein bestimmter String in der Datei vorkommt.
    Das klingt für mich nach StringInStr() aber keine Ahnung da ich ja nicht weiß was das werden soll am Ende.

  • Ich hab doch geschrieben es ist eine Sicherheitsüberprüfung das nur bestimmte Leute meine Programme nutzen können. Es wird ein Temporärer Key generiert der in der Registry gespeichert wird und dieser soll mit dem Dateiinhalt überprüft werden. Wenn dieser Key irgendwo in der Datei vorkommt gehts weiter -> kann das Programm genutzt werden oder wenn nicht dann beendet es sich. Das is der eigentliche sinn

  • Du hast geschrieben du brauchst alle Zeilen einer Datei - das liefern dir aber UEZ und meine Lösung.
    Du schreibst jedoch das dass nicht funktioniert.
    Klar - das wolltest du in Wirklichkeit auch nicht - du wolltest (so habe ich es jetzt verstanden) schauen ob ein Teilstring irgendwo in der Datei vorkommt.
    Kann aber keiner wissen da du das nicht gesagt hast.
    Das geht natürlich auch nicht mit einem einfachen " = "
    Das wäre ein Vergleich auf vollständige Übereinstimmung 2 er Strings.
    In deinem Fall wäre das also nur korrekt wenn in deinem Textfeld $CheckSerialInput die komplette Datei drin steht.
    Daher nimmt man für soetwas, wie ich gerade schrieb, die Funktion StringInStr().

  • So habe dies nun versucht

    Spoiler anzeigen
    [autoit]

    Func _CheckSerial($CheckSerialInput)
    InetGet("http://xxx/serial.txt",@TempDir & "\serial.txt", 1, 0)
    $file = FileOpen(@TempDir & "\serial.txt", 0)
    $read = FileRead($file)
    FileClose($file)
    $input = GuiCtrlRead($SerialNrInput)
    If StringinStr($read, $input) Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    Exit 0
    EndIf
    EndFunc

    [/autoit]

    Also er sollte ja jetzt überprüfen was in $SerialNrInput steht, das dann in $read suchen und sagen wenns vorhanden ist oder nicht. Nur er sagt das es nie vorhanden is egal obs drin steht oder nicht.
    Wo liegt mein Fehler?

    • Offizieller Beitrag

    Wenn die Beispiele aus Post 4 und Post 5 schon nicht bei dir funktionieren, dann kann es auch nicht gehen.
    Schau dir doch mal bitte die runtergeladene Datei an, ich denke hier hängt es schon.

    Gibt dieses Beispiel bei dir den richtigen Inhalt und Dateilänge aus?

    [autoit]

    Local $sData = InetRead("http://xxx/serial.txt")
    Local $nBytesRead = @extended
    MsgBox(4096, "", "Bytes read: " & $nBytesRead & @CRLF & @CRLF & BinaryToString($sData))

    [/autoit]
  • Wenn die Beispiele aus Post 4 und Post 5 schon nicht bei dir funktionieren, dann kann es auch nicht gehen.
    Schau dir doch mal bitte die runtergeladene Datei an, ich denke hier hängt es schon.


    Nein das sollte soweit alles passen. Es liegt ja am vergleichen wie auch schon von Asperin gesagt wurde aber ich weis nich was ich daran noch ändern könnte :/

  • Zum Debuggen empfiehlt es sich immer wieder zwischendurch sich den Inhalt von verwendeten Variablen mal ausgeben zu lassen um zu überprüfen ob sie tatsächlich das enthalten was sie sollten.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    Func _CheckSerial($CheckSerialInput)
    Local $sFile = BinaryToString(InetRead("http://xxx/serial.txt", 1 + 2))
    Local $sInput = GUICtrlRead($SerialNrInput)

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

    MsgBox(0, "Inhalt von $sFile", $sFile)
    MsgBox(0, "Inhalt von $sInput", $sInput)
    If StringInStr($sFile, $sInput, 2) Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    Exit 0
    EndIf
    EndFunc

    [/autoit]


    Ansonsten kann ich dein Skript selbst nicht testen.
    Auf der einen Seite übergibst du der Funktion eine Variable namens $CheckSerialInput welche in der Funktion gar nicht verwendet wird.
    Dann benutzt du die Variable $SerialNrInput ohne dass sie vorher deklariert wurde.
    Mir bleibt somit also auch nur raten.
    Zumindestens syntaktisch scheint alles in Ordnung zu sein.

  • ja da kommt raus Bytes read: 71 und dann die 3 Keys die z.z. in der datei stehen

    Edit: Gut nun gibts nen anderes Problem
    Wenn der Key sagen wir ABCD ist funzt das zwar aber wenn nur ABC eingegeben wird steht das ja indirekt auch in der Datei und wird somit als korrekt angesehen
    ich möchte aber das der Komplette Key verlangt wird :/

  • Sind die Keys alle durch einen Zeilenumbruch getrennt?
    Wenn ja dann kannst du ja anstatt nur auf den Key zu testen auf den Key + Zeilenumbruch prüfen.
    Also z.B. so:

    Spoiler anzeigen
    [autoit]

    Func _CheckSerial($CheckSerialInput)
    Local $sFile = BinaryToString(InetRead("http://xxx/serial.txt", 1 + 2))
    Local $sInput = GUICtrlRead($SerialNrInput)

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

    If StringInStr($sFile, $sInput & @CRLF, 2) Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    Exit 0
    EndIf
    EndFunc

    [/autoit]


    Alternativ wäre dann ein regulärer Ausdruck mit StringRegExp() - aber das ist schon bisschen mit Kanonen auf Spatzen geschossen.

  • Spoiler anzeigen
    [autoit]

    Func _CheckSerial($CheckSerialInput)
    Local $sFile = BinaryToString(InetRead("http://xxx/serial.txt", 1 + 2))
    Local $sInput = GUICtrlRead($SerialNrInput)
    If StringinStr($sFile, $sInput & @CRLF, 2) Then
    MsgBox(0, "Test", "Korrekt")
    Else
    MsgBox(0, "Test", "Falsch")
    Exit 0
    EndIf
    EndFunc

    [/autoit]

    Es sind alle durch einen Zeilenumbruch getrennt und nun kommt wieder immer Falsch raus :/

  • Kann es sein dass du die txt-Datei nicht unter Windows erstellt hast (dort markiert ein @CRLF den Zeilenumbruch) sondern z.B. unter Linux (dort markiert ein @LF den Zeilenumbruch).
    Dann müsste es natürlich so lauten:

    [autoit]

    If StringinStr($sFile, $sInput & @LF, 2) Then

    [/autoit]


    Und auch bei der letzten Serial muss dahinter noch ein Zeilenumbruch in der Originaldatei damit auch diese gefunden wird.

    • Offizieller Beitrag

    Poste doch mal eine Beispieldatei, dann hört die raterei auf.

  • du meinst die Serial.txt?

    A5DCE-F2019-778CA-62A32
    CA62A-32C77-CF617-45AC3
    DCEF2-01977-FCA62-A32C7
    BB707-C303F-DD7F0-C46EA

    Das is der Inhalt
    Den letzten Code habe ich gerad versucht zu nehmen und des Ging net
    Die Datei wurde unter Windows erstellt