Je voudrais être en mesure d'obtenir efficacement une sous-chaîne d'un MemoryStream (qui vient à l'origine d'un fichier xml dans un zip). Actuellement, je lis l'ensemble MemoryStream à une chaîne, puis rechercher les balises de début et de fin du nœud xml que je désire. Cela fonctionne bien, mais le fichier texte peut être très grand, donc je voudrais éviter de convertir l'ensemble MemoryStream dans une chaîne et au lieu simplement extraire la section souhaitée du texte XML directement à partir du flux.Obtenez de MemoryStream sans substring convertir flux entier en chaîne
Quelle est la meilleure façon de procéder?
string xmlText;
using (var zip = ZipFile.Read(zipFileName))
{
var ze = zip[zipPath];
using (var ms = new MemoryStream())
{
ze.Extract(ms);
ms.Position = 0;
using(var sr = new StreamReader(ms))
{
xmlText = sr.ReadToEnd();
}
}
}
string startTag = "<someTag>";
string endTag = "</someTag>";
int startIndex = xmlText.IndexOf(startTag, StringComparison.Ordinal);
int endIndex = xmlText.IndexOf(endTag, startIndex, StringComparison.Ordinal) + endTag.Length - 1;
xmlText = xmlText.Substring(startIndex, endIndex - startIndex + 1);
Vous pouvez créer un 'XmlReader' du flux de mémoire pour éviter de charger l'intégralité du fichier en mémoire. – juharr
@juharr: Ecrivez cela comme réponse. L'autre façon va être une douleur royale et probablement ne pas fonctionner correctement. – Joshua
quelle bibliothèque zip est-ce? Votre méthode actuelle extrait le fichier entier dans MemoryStream, ce qui peut entraîner une exception d'insuffisance de mémoire pour les gros fichiers. Dans .NET 4.5 [ 'ZipArchiveEntry.Open'] (https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry.open) peut être utilisé pour [diffuser le fichier] (http: //www.dotnetcurry.com/csharp/974/zip-archives-csharp-dotnet) – Slai