2017-10-13 4 views
0

J'essaye d'écrire un fichier texte. Voici mon principal, un peu clipsé pour plus de clarté:StringBuilder dans .net n'écrit pas le fichier entier

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 

Et voici un d'une douzaine de sous-marins qui ajoutent le texte du fichier:

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

Il y a une douzaine de méthodes qui ajoutent des choses comme ça , la plupart d'entre eux ajoutent environ 2k de texte au lieu du couple de lignes dans cet exemple. Lorsque j'examine SB dans le débogueur, le résultat total est un peu plus de 15k long. Mais quand j'ouvre le fichier, c'est 12k, et la fin est manquant - il coupe au milieu de l'une des cordes. Il n'y a aucune exception soulevée. Je sais que SB a des problèmes avec beaucoup de petits ajouts, c'est pourquoi j'ai utilisé le TempSB dans les sous-marins, mais il a exactement le même problème, et si je les ajoute directement à SB à la place, la seule différence est la "pause". "se produit quelques caractères plus tôt.

Quelqu'un peut-il offrir une suggestion quant à ce qui pourrait se produire?

+0

StringBuilder est pas cassé. L'oubli de l'instruction Using est un bug standard. –

+0

Quels sont les "problèmes" 'StringBuilder' avec beaucoup de petits' .Append's? – Fabio

+0

@Fabio - un certain nombre d'objets liés au flux .Net doublent leur allocation de mémoire lorsque vous atteignez la taille actuellement allouée. La table pour tenir ces blocs est petite, donc si vous organisez vos écritures de manière à ce qu'elles continuent à atteindre cette limite de mémoire tampon, vous pouvez "manquer d'espace" même pour de très petites tailles. J'ai tué des Streams à 50k. –

Répondre

2

StreamWriter utilise un tampon interne. Vous devez fermer() votre StreamWriter pour l'obliger à écrire les données tamponnées restantes dans le fichier. Mieux encore, enveloppez-le dans une instruction Using. Cela appellera son Dispose(), qui à son tour appelle son Close().

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

Il y a une méthode pratique qui va le faire pour vous en une seule ligne:

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

Wow, merci monsieur! Et la ligne unique est aussi propre. –