Meilleure façon de les écrire énorme chaîne de caractères dans un fichier
En C#, je suis en train de lire une taille moyenne de fichier (100 KO ~ 1 MO), la modification de certaines parties du contenu, et, enfin, l'écriture dans un fichier différent. Tous les contenus sont texte. La Modification est effectuée comme des objets de chaîne et de la chaîne des opérations. Ma démarche actuelle est:
- Lire chaque ligne du fichier d'origine en utilisant
StreamReader
. - Ouvrir un
StringBuilder
pour le contenu du nouveau fichier. - Modifier la chaîne de l'objet et l'appel de
AppendLine
de laStringBuilder
(jusqu'à la fin du fichier) - Ouvrir un nouveau
StreamWriter
, et d'écrire leStringBuilder
à l'écriture de flux.
Cependant, j'ai trouvé que StremWriter.Write
tronque 32768 octets (2^16), mais la longueur de StringBuilder
est plus grand que cela. Je pourrais écrire une simple boucle pour garantir l'ensemble de la chaîne de caractères dans un fichier. Mais, je me demandais quel serait le moyen le plus efficace en C# pour faire cette tâche?
Pour résumer, j'aimerais modifier seulement certaines parties d'un fichier texte et écrire dans un fichier différent. Mais, le texte de taille de fichier pourrait être plus important que de 32768 octets.
== Réponse == je suis désolé de faire confusin pour vous! C'était juste que je n'ai pas d'appel flush
. StremWriter.Write
ne dispose pas d'un court (par exemple, 2^16) limitation.
Avez-vous de la chasse ou de fermer votre StreamWriter?
La chasse d'eau est appelée automatiquement lorsque vous fermez l'écrivain (qui vous devriez vraiment le faire). Pour fermer l'écrivain, vous devez Disposer d'appel au lieu de les Fermer afin de vous libérer des ressources non managées. La meilleure façon de le faire est d'utiliser l'instruction à l'aide.
Donc... a Été le correctif encore à appeler Flush, ou fait quelque chose d'autre travail? Avoir un extrait de code? Je suis en cours d'exécution dans la même situation dans un HttpModule.
Jamais l'esprit... je l'ai juste essayé. Il a travaillé!
OriginalL'auteur Nullptr | 2011-02-17
Vous devez vous connecter pour publier un commentaire.
StreamWriter.Write
ne pas
tronquer la chaîne et n'a aucune limite.
En interne, il utilise
String.CopyTo
qui utilise code unsafe (à l'aide defixed
) pour copier les caractères si c'est le plus efficace.OriginalL'auteur
Le problème est probablement lié à la non fermeture de l'écrivain. Voir http://msdn.microsoft.com/en-us/library/system.io.streamwriter.flush.aspx.
Mais je suggère de ne pas charger tout le fichier en mémoire si cela peut être évité.
OriginalL'auteur
pouvez-vous essayer ceci :
Il éviter d'avoir plein de fichier chargé en mémoire, par traitement ligne par ligne et de l'écrire directement
OriginalL'auteur
Au lieu de courir dans le trou dokument je voudrais utiliser une regex pour trouver ce que vous cherchez pour l'Échantillon:
OriginalL'auteur
J'ai trouvé ce réponse très utile dans une situation similaire. Il n'y a pas tout le code source c'est plus comme des conseils. J'espère que cela aide.
OriginalL'auteur
Bien, cela dépend entièrement de ce que vous voulez modifier. Si vos modifications d'une partie du fichier de texte est dépendante d'une autre partie du fichier texte, vous aurez évidemment besoin d'avoir à la fois de ces parties dans la mémoire. Si toutefois, vous avez seulement besoin de modifier le fichier texte ligne par ligne, puis utiliser quelque chose comme ceci :
OriginalL'auteur
Avez-vous essayé
Fichier.WriteAllText()
méthode?OriginalL'auteur