2017-10-13 68 views
0

我想寫一個文本文件。這裏是我的主,稍修剪爲清楚:在.net中的StringBuilder不寫整個文件

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 

這裏是約十幾潛艇是文本添加到文件中的一個:

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

有十幾方法是添加這樣的事情,他們中的大多數在這個例子中添加了約2k的文本而不是幾行。當我在調試器中檢查SB時,總結果有點超過15K。但是當我打開這個文件的時候,它已經是12k了,最後都沒有了 - 它在一個字符串的中間被切斷了。沒有異常提出。

我知道SB有很多小的附加問題,這就是爲什麼我在subs中使用TempSB的原因,但它有完全相同的問題,如果我直接將它們添加到SB,唯一的區別是「break 「發生在幾個字符之前。

任何人都可以提供一個建議,可能會發生什麼?

+0

的StringBuilder不破。忘記Using語句是一個標準的錯誤。 –

+0

什麼是「StringBuilder」的「問題」有很多小的'。附加'? – Fabio

+0

@Fabio - 當您達到當前分配的大小時,許多與.Net流相關的對象會將其內存分配加倍。用於保存這些塊的表格很小,因此如果您組織寫入操作以使它們保持達到此緩衝區限制,那麼即使在非常小的尺寸下,也可能「空間不足」。我已經殺死了50k的Streams。 –

回答

2

StreamWriter使用內部緩衝區。您需要關閉()您的StreamWriter,強制它將剩餘的緩衝數據寫入文件。更好的是,將它包裝在Using語句中。這將調用它的Dispose(),然後調用它的Close()。

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

有一個方便的方法,將在單行爲你做這個:

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

哇,謝謝你,先生!單線也更清潔。 –