Announcement

Collapse
No announcement yet.

Letztes geöffnetes File

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Letztes geöffnetes File

    Hi ich eig ein ziemlicher Anfänger in Sachen VB (progge erst seit 3 Jahren und bringe mir alles selbst bei)

    Doch habe mich an ein neues Projekt gesetzt: Einen Texteditor.
    Bisher klappt alles super nur will ein ein Menüpunkt einbauen in dem man das letzte geöffnete file auswählen kann.
    Das geht auch Theoretisch aber Praktisch irgendwie doch nicht.

    Das ganze ist so asugebaut:
    Beim laden einer Datei wird in eine txt datei im sysverzeichniss der Pfad geschrieben ( überschreiben steht auf True).
    Beim start des Programmes wird nachgesehen ob die txt existiert, wenn nicht wird sie erstellt. Außerdem wird geguckt ob in der txt Zeichen sind wenn nicht wird der Stream reader direkt wieder beendet. wenn in der txt zeichen sind sollen diese(also der pfad solang die txt nicht manuell modifiziert wurde) in ein Erst dann sichtbar gemachten menüpunkt in der MenuToolBar geschrieben werden.
    Dies funktioniert alles. Doch schreibt er anstatt den zeichen in den Menüpunkt:
    Nichts.

    Das is das Problem an dem ich hänge. Hier mal der Code vom Form_load:

    [highlight=vbnet] Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim fSizeLNG As Object
    Dim lastopen1 As String
    Dim leer As String

    Lastopen1ToolStripMenuItem.Visible = False

    strWinVerz = System.Environment.SystemDirectory.ToString
    fSizeLNG = "0" & " kb"

    Lastopen1ToolStripMenuItem.Visible = False

    Me.Text = "139Pad"
    ToolStripStatusLabel1.Text = "Kein Ladevorgang"
    ToolStripStatusLabel2.Text = "Keine Datei geöffnet"
    ToolStripStatusLabel3.Text = "Größe:" & fSizeLNG

    If File.Exists(strWinVerz & "\" & DATEINAME) = False Then
    objDateiMacher = New StreamWriter(strWinVerz & "\" & DATEINAME)
    objDateiMacher.Close()
    objDateiMacher = Nothing
    End If

    objDateiLeser = File.OpenText(strWinVerz & "\" & DATEINAME)
    leer = objDateiLeser.ReadToEnd
    If leer = "" Then
    objDateiLeser.Close()
    Else
    lastopen1 = objDateiLeser.ReadToEnd()
    Lastopen1ToolStripMenuItem.Visible = True
    Lastopen1ToolStripMenuItem.Text = lastopen1
    objDateiLeser.Close()
    End If
    End Sub
    [/highlight]

    und hier der header-code wo auch die cons. DATEINAME drinn is:
    [highlight=vbnet]
    Imports System.IO
    Public Class Form1
    Dim objDateiLeser As StreamReader
    Dim objDateiMacher As StreamWriter
    Dim strWinVerz As String
    Const DATEINAME As String = "139pad_last_open_info.txt"
    [/highlight]


    Hoffe ihr könnt mir schnell helfen, denn ich wollt eig heute anbend noch mit der Speichern unter funltion anfangen

    Danke im vorraus
    Robin
    Zuletzt editiert von masteR139; 20.05.2009, 19:06.

  • #2
    folgendes sollte funktionieren:
    [highlight=vbnet]

    objDateiLeser = File.OpenText(strWinVerz & "\" & DATEINAME)

    leer = objDateiLeser.ReadToEnd

    If leer <> "" Then

    Lastopen1ToolStripMenuItem.Visible = True

    Lastopen1ToolStripMenuItem.Text = leer

    End If
    objDateiLeser.Close()
    [/highlight]
    zur Erklärung. Alle Reader Objekte in .Net die ich kenne sind vorwärtslaufend. Heißt wenn du liest bewegst du einen Offset in dem Reader. Nun zur Leer Überprüfung liest du schon bis zum Ende. Also wenn du nochmal zum Ende liest wo du ja schon bist dann liest du ... Nichts.
    Ich weiß nicht vielleicht könntest du bei einem Streamreader den Offset wieder an den Anfang setzten und noch einmal lesen aber warum das ganze. Du hast bereits gelesen dann überprüfst du halt auf leer und wenns nicht leer ist dann hast du doch deinen INhalt schon in der leer Variable.
    Vielleicht gäbe es auch eine Eigenschaft des Streamreaders die dir direkt per boolschem Wert mitteilt ob Daten vorhanden sind.

    Gruß das-d



    Noch zur Anmerkung einfacher als hier lange eine Textdatei zu erstellen wäre die Möglichkeit zu nutzen eine Benutzersetting zu erstellen. Dann hat jeder Nutzer am PC seine eigene letzt genutzte Datei und der Zugriff wäre einfacher.

    dann wäre der Code nur noch

    [highlight=vbnet]
    If My.Settings.LastUsedFile <> "" then
    'visible schalten und den Wert ovn My.Settings.LastUsedFile dem menüpunkt zuweisen und anzeigen.
    End If
    [/highlight]
    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

    Comment


    • #3
      Hallo Robin,

      dein Vorgehen scheint mir viel zu umständlich zu sein; deshalb bin ich mir nicht sicher, ob ich den richtigen Fehler gefunden habe. Ziemlich seltsam finde ich, dass du im FormLoad eine noch nicht vorhandene als "leere Datei" anlegst; diese Datei existiert dann auf jeden Fall; deren (leerer) Inhalt wird dann eingelesen. Was in diesem Fall bei ReadToEnd eingelesen wird, müsste mit dem Debugger kontrolliert werden.

      Einige Verbesserungsvorschläge: Zum Lesen und Schreiben dieser Datei besser File.ReadAllLines/WriteAllLines verwenden; dann kannst du auch mehrere Dateien registrieren. Wenn StreamReader/Writer verwendet werden, muss das unbedingt in einen Using-Block eingebunden werden, damit der Dateizugriff (Systemressource) freigegeben wird. Als Speicherort ist System.Environment.SystemDirectory völlig abwegig (in vielen Fällen auch gar nicht möglich), sondern besser Environment.SpecialFolder.ApplicationData o.ä. zu verwenden. (Übrigens ist SystemDirectory bereits ein String, ToString ist also völlig überflüssig.) Pfade werden durch Path.Combine zusammengesetzt; dein Dateipfad sollte nur einmal beim allerersten Aufruf erstellt werden und nicht bei jedem einzelnen Aufruf. Die Abfrage "= false" sollte besser durch "If Not" ersetzt werden. Gewöhne dir an, auch bei einfachen Methoden wie ToString die Klammern zu setzen.

      Gruß Jürgen

      Comment


      • #4
        Viele Vielen dank für die Antworten

        Besonders die Erklärung von das-d war sehr nützlich.
        Frag mich grad warum ich so verpeilt war.

        Die Tipps von Jürgen Thomas finde ich auch sehr gut zu gebrauchen werde ich mir merken das das auch einfach mit der File Klasse geht.

        Ob das Menü nun geht weis ich noch nicht aber wenn nicht werde ich direkt nochmal nachfragen.

        So nochma Danke an euch
        und jez geh ich ausbrobieren obs geht

        Comment

        Working...
        X