Starter schreibt nicht in .txt Datei

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Starter schreibt nicht in .txt Datei

    Hi Community,

    Ich möchte zur Zeit für ein Programm schreiben das Datenträger syncron halten soll. Das funktioniert so weit. Nun möchte ich eine Art Starter bauen, die ich mir in den Autostart lege und die dann nach einer Woche das Programm öffnet. Das mit dem vergleich des Datums funktioniert auch, bloß wenn das synchronisieren abgeschlossen wurde soll der Starter das jetzige Datum wieder in eine .txt schreiben, um es beim nächsten Start wieder einzulesen. das Problem hierbei ist das die .txt Datei jedes mal leer ist?

    Hier mein Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim lastupdate As DateTime
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Dim str As New FileStream(Application.StartupPath + "\lastupdate.txt", FileMode.Open)
    7. Dim reader As New StreamReader(str)
    8. Dim laststring As String = reader.ReadLine
    9. lastupdate = CDate(laststring)
    10. str.Close()
    11. If lastupdate.AddDays(7).Date = DateTime.Now.Date Then
    12. updated = True
    13. MsgBox("funkt")
    14. End If
    15. End Sub
    16. Dim updated As Boolean = False
    17. Sub writer()
    18. Dim sss As New FileStream(Application.StartupPath + "\lastupdate.txt", FileMode.Truncate)
    19. Dim writer As New StreamWriter(sss)
    20. Dim wr As Date = DateTime.Now
    21. writer.WriteLine(CStr(wr))
    22. End Sub
    23. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    24. If updated = True Then
    25. writer()
    26. End If
    27. End Sub
    28. End Class


    Das programm liegt gerade noch in dem Projektverzeichniss, an Adminrechten kann es also nicht liegen.

    Weiß jemand rat?

    8-) faxe1008 8-)
    Setz mal in die Form1_Load einen Haltepunkt und steppe sie durch.
    Ich glaube, Du fliegst da iwo raus (das gibt leider keine Exception).
    Genau so gut kannst Du den Code in eine Button-Click packen und auf Exceptions testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @faxe1008: Das ist alles ein elender Ranz-Code. Wenn keine Datei da ist, knallt er unbemerkt in der Form_Load.
    Wenn die Datei leer ist, knallt er unbemerkt in der Form_Load.
    Arbeite so, dass es egal ist, ob da eine Datei ist oder nicht und ob da was drin steht oder nicht.

    VB.NET-Quellcode

    1. System.IO.File.WriteAllLines(...)
    2. System.IO.File.ReadAllLines(...)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Ok so funkts:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim lastupdate As DateTime
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. ' Dim str As New FileStream(Application.StartupPath + "\lastupdate.txt", FileMode.Open)
    7. ' Dim reader As New StreamReader(str)
    8. Dim laststring As String = IO.File.ReadAllText(Application.StartupPath + "\lastupdate.txt")
    9. lastupdate = CDate(laststring)
    10. ' str.Close()
    11. If lastupdate.AddDays(7).Date = DateTime.Now.Date Then
    12. updated = True
    13. MsgBox("funkt")
    14. End If
    15. End Sub
    16. Dim updated As Boolean = False
    17. Sub writer()
    18. 'Dim sss As New FileStream(Application.StartupPath + "\lastupdate.txt", FileMode.Truncate)
    19. 'Dim writer As New StreamWriter(sss)
    20. Dim wr As Date = DateTime.Now
    21. IO.File.WriteAllText(Application.StartupPath + "\lastupdate.txt", CStr(wr))
    22. 'writer.WriteLine(CStr(wr))
    23. End Sub
    24. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    25. If updated = True Then
    26. writer()
    27. End If
    28. End Sub
    29. End Class


    wo liegt jetzt der genaue unterschied (möchte auch verstehen warum, das so ist)?

    8-) faxe1008 8-)

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

    FileMode.Open erwartet eine existierende Datei. Ist diese möglicherweise nicht da, nutze FileMode.OpenOrCreate.
    Aus einer Datei, die leer ist, kann man nix auslesen.
    Genau so wenig kann man einen leeren String in ein DateTime konvertieren, teste dies:

    VB.NET-Quellcode

    1. MessageBox.Show(CDate(""))
    Und nutze .NET-Methoden: .ToString, DateTime.TryParse(), ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Posting aus dem Thread [VB 2010] Debuggen, Fehler finden und beseitigen hierher verschoben.

    RodFromGermany schrieb:

    Genau so denke ich, dass die (Un-)Kollegen Lehrer ihren Schülern genau dies beibringen,


    ich habe noch kein Informatik, bin erst nächstes Jahr Oberstufe. werde trotzdem als zusatzkurs Informatik wählen.

    RodFromGermany schrieb:

    Ich unterstelle mal dem Programm, dass eine MessageBox kommen soll, wenn das Programm up to date ist.


    nope das sollte nur ein Syncronisierungsprogramm von mir starten und der Rechner auf dem es liegt, ist eh immer an.
    die txt heißt nur uptodate weils kurz ist und der Datenträger ja up to date bleiben soll
    Die Msgbox habe ich nur eingebaut weil ich die Überprüfung zu erst zum laufen bringen lassen wollte um mich dann um den Rest zu kümmern.


    und noch mals dank für die Erklärung, jetzt ist mir einiges Klarer und werde es auch versuchen in Zukunft anzuwenden. :thumbup:

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    faxe1008 schrieb:

    nope das sollte nur
    Entschuldige bitte, dass ich Dich nicht um die Urheberrechte für Deine Quellzeilen gebeten habe.
    In meinem Tut muss ich erklären, warum ich dort was mache, damit es rund ist.
    Was Du Dir bei Deinem Programm gedacht hast ist erstens für mich und zweitens für mein Tut völlig unerheblich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!