Textfeld vergleichen funktioniert nicht

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Dober75.

    Textfeld vergleichen funktioniert nicht

    Hallöchen zusammen in eurer Gemeinde,

    ich stehe hier vor einem Problem, oder ich bin zu blind den Fehler zu sehen.

    Folgende "Problematik":

    Ich habe auf einem Webserver 2 Datein, welche Versionsnummern beinhalten. Sind keine txt-Datein, aber ist halb so wild. Ich habe mir jetzt ein VB Script gebastelt, welches die beiden Dateien in lokal gespeicherte txt Dateien umwandelt.

    Am Ende werden die aktuellen Dateien (mit den Versionsnummern) lokal gespeichert unter anderem Namen. Beim Starten des Scripts werden in 4 Textfeldern die Versionen (je Datei die online und die lokal gespeicherte) angezeigt. Dann sollen die Versionsnummern einfach miteinander Verglichen werden, was aber irgendwie nicht funktioniert. Folgender Code verwende ich dazu:

    Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. If Datei1.Text = Datei1local.Text Then
    3. MsgBox("Keine neue Version")
    4. Else
    5. MsgBox("Neue Version verfügbar !")
    6. End If
    7. End Sub


    Wenn die beiden Versionsnummern übereinstimmen soll er eigentlich ne Meldung rausbringen, das es keine aktuelle Version gibt, ansonsten das es eine gibt. Auslöser für den Vergleich ist ein Button. Aber ich bekomme immer die Meldung, das es eine neue Version gibt, auch wenn der Inhalt der beiden Textboxen gleich ist. Weiß einer, woran das liegt ?
    Datei1 ist ein String, welcher den Inhalt der txt Datei beinhaltet. Also im Endeffekt werden in den Textfeldern txt Dateien angezeigt, die miteinander verglichen werden sollten.

    Datei1.Text = Versionsnummer in Datei vom Webserver in einem Textfeld
    Datei1local.Text = Versionsnummer in der lokal gespeicherten Datei in einem Textfeld

    diese beiden sollen miteinander Verglichen werden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dober75“ ()

    Aber wenn Datei1 ein String ist, dann dürfte dein Code garnicht kompilieren. Denn String hat weder ne Text-Property noch ne Text-Function.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Hmmm... ehrlich gesagt weiß ich es nicht. Hier mal der ganze Code, vielleicht blicks du dann mehr durch, was ich meine:

    Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim downloader1 As New System.Net.WebClient
    5. downloader1.DownloadFile("http://blablabla1.ver", "blablabla1.web.txt")
    6. Datei1.Text = File.ReadAllText("blablabla1.web.txt")
    7. Dim downloader2 As New System.Net.WebClient
    8. downloader2.DownloadFile("http://blablabla2.ver", "blablabla2.web.txt")
    9. Datei2.Text = File.ReadAllText("blablabla2.web.txt")
    10. Datei1local.Text = File.ReadAllText("blablabla1.local.txt")
    11. Datei2local.Text = File.ReadAllText("blablabla2.local.txt")
    12. End Sub
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. Dim writer1 As StreamWriter = File.CreateText("rblablabla1.local.txt")
    15. For Each s As String In Datei1.Lines
    16. writer1.WriteLine(s)
    17. Next
    18. writer1.Close()
    19. Dim writer2 As StreamWriter = File.CreateText("blablabla2.local.txt")
    20. For Each s As String In Datei2.Lines
    21. writer2.WriteLine(s)
    22. Next
    23. writer2.Close()
    24. Me.Close()
    25. End Sub
    26. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    27. If Datei1.Text = Datei1local.Text Then
    28. MsgBox("Keine neue Version")
    29. Else
    30. MsgBox("Neue Version verfügbar !")
    31. End If
    32. End Sub
    33. End Class


    Beim erstmaligen Starten schreibt er beim Beenden (Button1) die beiden localen Dateien und beim wiederholten Starten aktuallisiert er diese dann nur noch.

    Dober75 schrieb:

    Datei1.Text = File.ReadAllText("blablabla1.web.txt")
    Datei2.Text = File.ReadAllText("blablabla2.web.txt")
    Datei1local.Text = File.ReadAllText("blablabla1.local.txt")
    Datei2local.Text = File.ReadAllText("blablabla2.local.txt")

    Jede variable hier ist also eine Textbox.

    Haste mal nen Breakpoint an der Stelle gesetzt, an die strings verglichen werden? es könnte sein, dass eine der beiden Dateien so etwas wie ein \r\n am Ende hat, und die anderen nicht. Dann is natürlich der String nicht gleich.

    ThePlexian schrieb:

    ...wenn Datei1 ein String ist...

    Dober75 schrieb:

    ...ehrlich gesagt weiß ich es nicht.

    Ist das dein quellcode? Von dir geschrieben? Dann solltest du aber wissen, welche Variable was ist...

    Ja, es sind quasi 4 Textboxen. Und es wird doch der Inhalt der Textboxen verglichen und nicht die Dateien an sich, oder ? Zumindest war so mein Plan. Habs gerade mal mit manuellen Werten in den Textboxen ausprobiert, da funktioniert es. Also muss irgendwo ein Problem bei der Übergabe der Dateiinhalte an die Textbox sein. Die Werte in den Boxen sind aber so Wertmäßig identisch. Was wird denn noch an die Boxen übergeben ?


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dober75“ ()

    na halt so unsichtbare zeichen: zeilvorschub, spaces, Tabs etc.

    Da du Zeiten vergleichen willst, ist ein String-Vergleich, wie du ihn da hast auch sehr unangemessen.

    Parse die Strings in DateTime -Strukturen, und vergleiche letztere.
    Da gibts dann auch keine Zeilvorschüber mehr.

    Übrigens dringend empfohlen: Visual Studio - Empfohlene Einstellungen
    Du siehst ja: beim Thema Datentypen bist du ziemlich am Schwimmen, und das ist eine Folge der üblen Vor-Einstellungen, mit denen VisualStudio ausgeliefert wird.

    EaranMaleasi schrieb:


    Mach das mal bitte aber mit den Werten aus den Dateien.


    OK, Ergebniss:
    Datei1.Text "14335.01 01.12.2014 12:00"
    Datei1local.Text ""14335.01 01.12.2014 12:00" & vbCrLf & ""

    Stellt sich mir jetzt die Frage, wo nimmt er diese Zeichen her ? Die Datei1.local wird ja aus den Daten der Textbox 1 geschrieben beim beenden. Erklärt natürlich, warum er keine Übereinstimmung erkennt.

    Der Inhalt der Datein scheinen aber identisch zu sein lt. der Angabe im Breakpoint:

    Datei1: {Text = "14335.01 01.12.2014 12:00"}
    Datei1local: {Text = "14335.01 01.12.2014 12:00"}

    Edit: Hab die Datein mal mitn Editor überprüft. Da wird in der Datei1local ein neuer Absatz mit reingemacht beim Schreiben aus welchem Grund auch immer :( Wenn ich diesen manuell entferne, zeigt er auch die richtige Überprüfung an

    Sind ja nicht nur Datum und Zeit. In der Datei steht auch die Versionsnummer. Deswegen wollte ich "einfach" den Inhalt vergleichen. Mit den Einstellungen vür Visual Studio werd ich mich gleich mal auseinander setzen und ja, ich hab den Code selber zusammen gebastelt, muss aber sagen, das ich genau seit heute mich damit beschäftige :( Hab bisher nur bisl mit Excel Macros rumgespielt gehabt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dober75“ ()

    ThePlexian schrieb:

    Aber wenn Datei1 ein String ist, dann dürfte dein Code garnicht kompilieren. Denn String hat weder ne Text-Property noch ne Text-Function.

    Dober75 schrieb:

    Datei1.Text = File.ReadAllText("blablabla1.web.txt")

    Warum ignorierst du diesen, nicht unerheblichen Hinweis ?


    Du bringst hier einiges durcheinander, und solltest dir volgendes Grundwissen aneignen.:
    • Was ist eine Variable und wozu ist sie da ?
    • Was sind Datentypen und welche sind in welchem Szenario sinnvoll ?
    • Was ist die Aufgabe von Controls und was nicht ?
    Meide VB6 Relikte wie z.B. MsgBox (VB.Net Aquivalent MessageBox), oder vbCrLf (VB.Net Aquivalent Environment.NewLine)
    Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    Böse Funktionen vermeiden

    Und nutze doch bitte denn entsprechenden BB-Code, in diesem Fall für VB.Net ( = [vbnet][/vbnet]) !
    Ne, soll kein Updater sein (werden). Es soll nur überprüft werden, ob eine neue Version vorhanden ist. Da die Versionsnummer in eine Datei geschrieben wird, müßte man diese erst Downloaden, dann mit nem Editor öffnen dann die vorhandene Versionsdatei öffnen und diese beiden miteinander vergleichen, das ganze 2 mal (da 2 Dateien). Diesen Vorgang wollte ich automatisieren. Am Ende soll bei einer neuen Version noch eine E-Mail versendet werden, da das ganze auf ner VM läuft.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dober75“ ()

    So, hab mein Problem selber gelöst. Hab

    VB.NET-Quellcode

    1. writer1.WriteLine(s)


    gegen

    VB.NET-Quellcode

    1. writer1.Write(Datei1.Text)


    geändert. Somit schreibt er nur den Inhalt von "Deite1.Text" in die Datei und dann stimmt auch der Vergleich.
    ich nehme an, du hast nicht nur die eine Zeile ausgetauscht, sondern die ganze Schleife ersetzt:

    VB.NET-Quellcode

    1. 'statt
    2. For Each s As String In Datei1.Lines
    3. writer1.WriteLine(s)
    4. Next
    5. 'einfach
    6. writer1.Write(Datei1.Text)
    Eine gute Lösung - Code kürzer, und den Zeilvorschub vom WriteLine biste so auch los.
    Jepp, hab mal ne halbe Stunde mit google verbracht. Wenn ich doch nur immer soviel Zeit hätte ;) Bin drauf gekommen, als ich mich bisl in den Textstring reinversetzt habe. Warum soll ich den Inhalt der Textbox in die Dateis chreiben, wenn der Inhalt eh schon in einem String steht. Wäre ja doppel gemoppelt. So, nun gehts weiter... soll ja eigentlich ein Script ohne Benutzeraktion werden.