L'ajout d'un texte de début et de fin de fichier en C#
J'ai un processus qui prend une série de "xml" des fichiers. La raison j'ai mis xml entre guillemets, c'est que le texte dans le fichier n'est pas un élément racine qui fait en xml non valide. Dans mon traitement, je tiens à corriger ce problème et d'ouvrir chaque fichier ajouter un nœud racine au début et à la fin de chaque fichier, puis le refermer. Voici ce que j'avais en tête, mais cela implique l'ouverture du fichier, la lecture de tout fichier de marquage sur les nœuds, et puis l'écriture de l'ensemble du fichier. Ces fichiers peuvent être de plus de 20 MO en taille.
foreach (FileInfo file in files)
{
//open the file
StreamReader sr = new StreamReader(file.FullName);
//add the opening and closing tags
string text = "<root>" + sr.ReadToEnd() + "<root>";
sr.Close();
//now open the same file for writing
StreamWriter sw = new StreamWriter(file.FullName, false);
sw.Write(text);
sw.Close();
}
Toutes les recommandations?
- Juste être curieux: à l'Aide d'une chaîne de ici va être mauvais pour la performance, ou C# string classe assez bon pour cela?
- La principale raison de ne pas utiliser des chaînes de caractères, c'est qu'il est immuable, ce qui signifie que chaque fois que vous ajoutez des choses à cordes, vous devez faire un nouvel objet de type String. Depuis son code a seulement 2 précédents, je ne vois pas l'avantage de l'utilisation des StringBuilder, mais je suis peut-être raté quelque chose. Comme Earwicker noter toutefois, il existe une meilleure méthode.
- Je suis tombé sur cette question, parce que je voulais que mes fichiers journaux pour avoir le dernier message en haut. J'ai maintenant déménagé l'enregistrement à une table, et un tri par type DateTime.. 🙂
Vous devez vous connecter pour publier un commentaire.
Pour éviter de tenir tout le fichier en mémoire, renommez le fichier d'origine, puis de l'ouvrir avec
StreamReader
. Ensuite, ouvrez le nom de fichier d'origine avecStreamWriter
pour créer un nouveau fichier.Écrire le
<root>
préfixe du fichier, puis copier les données en grande-ish morceaux du lecteur à l'écrivain. Lorsque vous avez transféré toutes les données, écrire la clôture</root>
(notez la barre oblique si vous voulez qu'il soit XML). Fermez les deux fichiers et de supprimer la renommé d'origine.20 MO n'est pas terriblement bien, mais quand vous lisez comme une chaîne de caractères, on utilise environ 40 MO de mémoire. Ce n'est pas très bien non plus, mais c'est le traitement que vous n'avez pas besoin de le faire. Vous pouvez le manipuler comme des brutes octets afin de réduire l'utilisation de la mémoire, et pour éviter de décodage et ré-encodage des données:
Si vous avez besoin de recude l'utilisation de la mémoire beaucoup plus, utiliser un deuxième fichier que Earwicker suggéré.
Edit:
Ajouté le code pour gérer BOM (byte order mark).
Je ne peux pas voir une réelle amélioration sur ce...qui est une sorte de déception. Car il n'y a aucun moyen de "shift" un fichier que vous aurez toujours à déplacer les octets dans l'ensemble du fichier à injecter quoi que ce soit en haut.
Vous peut trouver un certain avantage en termes de performances en utilisant des flux plutôt que le StreamReader qui a fait analyser le flux de texte.
Si vous ne voulez pas le faire c'est le C#, il serait facile de gérer à la ligne de commande ou dans un fichier de commandes.
Cela suppose que vous avez certains processus pour obtenir les fichiers de données que cela pourrait être accroché dans.