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?
StringBuilder est pas cassé. L'oubli de l'instruction Using est un bug standard. –
Quels sont les "problèmes" 'StringBuilder' avec beaucoup de petits' .Append's? – Fabio
@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. –