2017-10-13 1 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 

このようなものを追加ダース方法についてがありますこれらのほとんどは、この例の2〜3行の代わりに約2kのテキストを追加します。デバッガでSBを調べると、合計結果は15kを少し超えています。しかし、私がファイルを開くとき、それは12kであり、最後はすべて欠けています - それは文字列の1つの途中で途切れます。例外はありません。

私はSBが少しの追加が多いので、私はTempSBをサブシステムで使用していたことを知っていますが、まったく同じ問題があります。SBに直接追加すると、 "は、より早い文字が現れます。

何が起こっている可能性がありますか?

+0

のStringBuilderは壊れません。 Usingステートメントを忘れるのは標準的なバグです。 –

+0

「StringBuilder」にはほとんど「.Append'sがたくさんある」という問題がありますか? – Fabio

+0

@Fabio - 現在割り当てられているサイズに達すると、多数の.Netストリーム関連オブジェクトがメモリ割り当てを倍増します。これらのブロックを保持するためのテーブルは小さいので、このバッファ制限を超えないように書き込みを整理すると、非常に小さいサイズであっても "領域を使い果たしてしまう"ことがあります。私は50kでストリームを殺しました。 –

答えて

2

StreamWriterは内部バッファを使用します。 StreamWriterを閉じて残りのバッファリングされたデータをファイルに書き込むようにする必要があります。もっと良いですが、Usingステートメントでラップしてください。それはそのDispose()を呼び出し、そのDispose()は次にClose()を呼び出します。

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

単一のラインであなたのためにこれを行います便利なメソッドがあります:

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

うわー、ありがとう!そして、シングルラインもよりクリーンです。 –

関連する問題