2017-10-13 7 views
0

Ich versuche, eine Textdatei zu schreiben. Hier ist meine Haupt, leicht beschnitten für Klarheit:StringBuilder in .net nicht ganze Datei schreiben

Private Sub WriteProperty(FilePath As String) 
    Try 
     SB = New StringBuilder 
     WriteConfig() 
     'a bunch of methods similar to WriteConfig here... 
     Dim File As New System.IO.StreamWriter(FilePath) 
     File.WriteLine(SB.ToString()) 
    Catch ex As Exception 
     Dim X As Integer = 5 'cheesy way to add a breakpoint 
    End Try 
End Sub 

Und hier ist eine von etwa einem Dutzend U-Boote, die Text in der Datei hinzufügen:

Private Sub WriteConfig() 
    Dim TempSB As New StringBuilder 
    TempSB.AppendLine("[CONFIG]") 
    TempSB.AppendLine("[END_CONFIG]") 
    TempSB.AppendLine("") 
    SB.Append(TempSB) 
End Sub 

Es gibt etwa ein Dutzend Methoden, die Dinge wie diese hinzufügen , die meisten von ihnen hinzufügen etwa 2k Text anstelle der paar Zeilen in diesem Beispiel. Wenn ich SB im Debugger untersuche, ist das Gesamtergebnis etwas über 15k lang. Aber wenn ich die Datei öffne, ist es 12k, und das Ende fehlt - es schneidet in der Mitte einer der Saiten ab. Es gibt keine Ausnahme.

Ich weiß, SB hat Probleme mit vielen kleinen Anhängen, weshalb ich die TempSBs in den Subs verwendet habe, aber es hat genau das gleiche Problem, und wenn ich sie direkt SB hinzufügen, ist der einzige Unterschied der "Pause "tritt ein paar Zeichen früher auf.

Kann jemand einen Vorschlag bieten, was passiert sein könnte?

+0

Stringbuilder ist nicht gebrochen. Das Vergessen der Using-Anweisung ist ein Standardfehler. –

+0

Was sind die "Probleme" die 'StringBuilder' mit vielen kleinen' .Append's haben? – Fabio

+0

@Fabio - Eine Anzahl von .Net streambezogenen Objekten verdoppeln ihre Speicherzuweisung, wenn Sie die aktuell zugewiesene Größe erreichen. Die Tabelle zum Halten dieser Blöcke ist klein. Wenn Sie Ihre Schreibvorgänge so organisieren, dass sie dieses Pufferlimit überschreiten, können Sie selbst bei sehr kleinen Größen "keinen Platz mehr haben". Ich habe Streams um 50k getötet. –

Antwort

2

Stream verwendet einen internen Puffer. Sie müssen Ihren StreamWriter schließen(), damit er die verbleibenden gepufferten Daten in die Datei schreibt. Besser noch, verpacken Sie es in eine Using-Anweisung. Das wird sein Dispose() aufrufen, das sein Close() aufruft.

Using File As New System.IO.StreamWriter(FilePath) 
    File.WriteLine(SB.ToString()) 
End Using 

Es ist eine bequeme Methode, das für Sie in einer einzigen Zeile tun:

System.IO.File.WriteAllText(FilePath, SB.ToString()) 
+0

Wow, danke, mein Herr! Und die Single-Line ist auch sauberer. –

Verwandte Themen