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

을 그리고 여기에 파일에 텍스트를 추가에 대한 다스 잠수함 중 하나입니다

이 같은 일을 추가 메서드는 약 12 ​​개
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가 많은 추가 기능에 문제가 있다는 것을 안다. 그래서 나는 잠수함에서 TempSB를 사용했는데, 똑같은 문제가있다. SB에 직접 추가하면, 유일한 차이점은 "휴식 "몇 자 전에 발생합니다.

어떤 일이 일어날 지 제안 할 수 있습니까?

+0

의 StringBuilder가 파손되지 않습니다

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

은 한 줄에 당신을 위해이 작업을 수행하는 편리한 방법이있다. Using 문을 잊어 버리는 것은 표준 버그입니다. –

+0

"StringBuilder"에 작은 ".Append's가 많이있는"문제점 "은 무엇입니까? – Fabio

+0

@Fabio - 현재 할당 된 크기에 도달하면 .Net 스트림 관련 개체가 메모리 할당량을 두 배로 늘립니다. 이러한 블록을 보관하는 테이블은 작기 때문에이 버퍼 제한을 계속 유지하도록 쓰기를 구성하면 매우 작은 크기에서도 "공간이 부족할 수 있습니다". 50k로 스트림을 죽였어. –

답변

2

StreamWriter는 내부 버퍼를 사용합니다. StreamWriter가 버퍼링 된 나머지 데이터를 파일에 쓰도록하려면 StreamWriter를 Close()해야합니다. 더 나은 방법은 Using 문에서 감싸는 것입니다. 그러면 Dispose()가 호출되어 Close()가 호출됩니다.

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

와우, 고마워요! 그리고 싱글 라인도 깨끗합니다. –

관련 문제