Od jakiegoś czasu (o ile mam ten czas) przepisuję na nowo XmlBloga. Tym razem chcę skorzystać z klasy XMLWriter, a nie jak do tej pory XmlDocument. Dlaczego z tej klasy? Otóż pozwala ona bardziej panować nad tym co i w jaki sposób jest zapisywane do pliku XML.
Ponadto dzięki tej klasie mogę dopisywać kolejne dane na koniec istniejącego pliku bez wczytywania całości. Jest to dosyć istotne, aby zwiększyć wydajność i przy większej ilości postów nie wczytywać ich wszystkich do pamięci. Zwłaszcza kiedy na stronie wyświetlamy tylko kilka ostatnich.
Poniżej prezentuję prototyp metody zapisującej dane w XMLBlogu w nowej wersji.
1: public static void SerializeAndSaveList(IXWriterObject obj)
2: {
3: string objectTag = obj.GetTag();
4: string file = Utils.GetListFileNameForObject(obj);
5: file = Path.Combine(XimiManager.DataDirectory, file);
6: using (FileStream f = new FileStream(file, FileMode.Open, FileAccess.Write))
7: {
8: f.Seek(-(objectTag.Length), SeekOrigin.End);
9: using (StreamWriter closer = new StreamWriter(f))
10: {
11: XmlWriter writer = XmlWriter.Create(closer, Utils.WriterSettings);
12: obj.Write(writer);
13: writer.WriteRaw("\r\n" + objectTag);
14: writer.Flush();
15: }
16: }
17: }
Metoda przyjmuje obiekt, który implementuje interface IXWriterObject. Interface ten eksponuje jedną metodę Write, która wpisuje treść do pliku.
Samo dopisanie danych na końcu pliku jest możliwe kiedy go otworzymy i przesuniemy pozycję w strumieniu na koniec (SeekOrigin.End) oraz cofniemy się w stronę początku o tyle znaków z ilu składa się tag zamykający dany plik XML. Na przykład </blogs>. W tym przypadku do pobrania tego tagu korzystam z metody statycznej GetListEndTagForType z klasy Util.
To już w sumie wszystko, a może da się optymalniej? :)
Ten post jest widoczny także na:
ZINE.NET