File.WriteAllText() oder StreamWriter

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    File.WriteAllText() oder StreamWriter

    Nur mal so eine grundsätzliche Frage, weil die Frage auch schon im Forum kam:

    "Was ist besser/verwendet ihr lieber, IO.File.WriteAllText und Konsorten oder IO.StreamWriter & co.? Und wieso (Vor-/Nachteil)"
    Vorteile ergeben sich z.B. wenn man eine Datei aus mehreren Teilen zusammen setzt, ohne sie vorher in einen String laden zu müssen, beispiel:

    VB.NET-Quellcode

    1. Dim sw As New StreamWriter("datei.txt")
    2. For Each oItem As String In ListBox1.Items
    3. sw.WriteLine(oItem)
    4. Next
    5. sw.WriteLine("------------ Trennlinie ---------------")
    6. sw.WriteLine(Datetime.Now.ToString())
    7. sw.Close()


    würde schneller gehen und die bessere und professionelle Methode sein als

    VB.NET-Quellcode

    1. Dim Datei As String = "datei.txt"
    2. For Each oItem As String In ListBox1.Items
    3. IO.File.WriteAllText(Datei, oItem, WriteType.Append)
    4. Next
    5. IO.File.WriteAllText(Datei, "------------ Trennlinie ---------------", WriteType.Append)
    6. IO.File.WriteAllText(Datei, Datetime.Now.ToString(), WriteType.Append)


    Ob das jetzt WriteType.Append heißt weiß ich nicht, is ausm Kopf geschrieben, irgend so ein Enum gibts da, dass die Datei immer angefügt wird.
    Was hier eben passiert, bei jedem WriteAllText wird die Datei geöffnet, geschrieben und wieder geschlossen. Beim StreamWriter wird die Datie geöffnet und bleibt offen solange bis man die Close() Methode ausführt.

    Wenn man nur einen String hat, wäre es sicher irrelevant was man nutzt und würde wohlmöglich eher zu letzterem tendieren, da hier nur eine Zeile benötigt würde, beim StreamWriter jedoch min 3 Zeilen.
    Hi,
    also ich machs immer so:

    VB.NET-Quellcode

    1. Dim Output As String = Nothing
    2. for each Items As String In Listbox1.Items
    3. Output &= items & vbnewline
    4. Next
    5. Output = Output.Remove(Output.length - 1, Output.length) & vbnewline & "------------ Trennlinie ---------------" & vbnewline & Datetime.Now.ToString()
    6. Io.file.writealltext("pfad", Output)

    Mfg
    Loadsoft
    Deswegen schrieb ich ja auch explizit

    Dodo schrieb:

    [...]wenn man eine Datei aus mehreren Teilen zusammen setzt, ohne sie vorher in einen String laden zu müssen[...]
    @Loadsoft: Dein Code ist wie es ein Laie machen würde. Aber da wir ja wollen dass auch neue anständig und Resourcen optimiert programmieren lernen ist dien Codebeispiel eher ein schlechtes Beispiel und wie Singu meinte ist hierfür ein StrngBuilder wenn überhaupt von vorteil.
    Aber wieso eine extra Variable wenn der StreamWriter eben selbes mitliefert, da wäre ein StringBuilder auch eine verschwendete Resource.

    Edit: Zudem wieso machst du das Remove und löscht das letzte Zeichen in deinem String in diesem Fall wolltest du den letzten Zeilenumbruch entfernen nehm ich an um ihn aber gleich danach nochmal wieder anzufügen?? Zudem besteht ein Zeilenumbruch unter Windows aus 2 Steuerzeichen und zwar aus Carriage Return und Line Forward, löscht du nur das letzte Zeichen bleibt jedoch das Steuerzeichen Carriage Return bestehen.
    Hier findet ihr ein kurzes Beispiel, wie man das ganze ohne Zeilenumbruch einfügen macht.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim sb As New System.Text.StringBuilder()
    4. sb.AppendLine("Zeile 1")
    5. sb.AppendLine("Zeile 2")
    6. MessageBox.Show(sb.ToString())
    7. End Sub
    8. End Class