public static void Загрузить(string directory) { //не загружать если используется внешний кеш //if (MemoryCache.IsMemoryCacheClient) // return; if (!System.IO.Directory.Exists(directory)) { return; } lock (lockCacheXml) { Items.Clear(); var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(Dictionary <string, КешЭлемент>), КешЭлемент.KnownTypeList()); foreach (var file in System.IO.Directory.GetFiles(directory, "*.cache")) { if (new FileInfo(file).Length == 0) { continue; } //<KeyValueOfstringКешЭлементh9JraY4p> // <Key>5элемент:Z:КешИдентификаторРаздела:&11d97d4f-2153-e211-bb73-0030487e046b</Key> // <Value xmlns:d3p1="http://schemas.datacontract.org/2004/07/RosService.Caching" i:type="d3p1:КешИдентификаторРаздела"> // <d3p1:ДатаСоздания>2013-01-01T01:49:00.796875+04:00</d3p1:ДатаСоздания> // <d3p1:id_node>967854</d3p1:id_node> // </Value> //</KeyValueOfstringКешЭлементh9JraY4p> var fileXml = System.IO.File.ReadAllText(file); //var xml = System.Xml.Linq.XDocument.Load(new StringReader(fileXml)); //foreach (var item in xml.Root.Elements().ToArray()) //{ // if (item.Element(XName.Get("Key", "http://schemas.microsoft.com/2003/10/Serialization/Arrays")).Value.Contains("КешИдентификаторРаздела")) // item.Remove(); //} //var xml = System.Text.RegularExpressions.Regex.Replace(fileXml, @"<KeyValueOfstringКешЭлемент[\a\d]>(.+?)</KeyValueOfstringКешЭлемент[\a\d]>", "", RegexOptions.Multiline); var obj = ser.ReadObject(XmlReader.Create(new StringReader(fileXml))) as Dictionary <string, КешЭлемент>; if (obj != null) { foreach (var item in obj) { if (item.Value is КешХешьТаблицаПамять) { continue; } //else if (item.Value is КешСчётчик) continue; Items.AddOrUpdate(item.Key, item.Value, (k, e) => e = item.Value); } } } } }
public static void Сохранить(string directory, bool ОставитьПредыдущююВерсию, bool async) { //не сохранять если используется внешний кеш //if (MemoryCache.IsMemoryCacheClient) // return; var task = System.Threading.Tasks.Task.Factory.StartNew(() => { lock (lockCacheXml) { try { var sb = new StringBuilder(); var settings = new XmlWriterSettings(); settings.Indent = true; settings.OmitXmlDeclaration = true; if (!System.IO.Directory.Exists(directory)) { System.IO.Directory.CreateDirectory(directory); } var last_directory = Path.Combine(directory, string.Format("{0:yyyy.MM.dd__hh.mm.ss}", DateTime.Now)); if (ОставитьПредыдущююВерсию && !System.IO.Directory.Exists(last_directory)) { System.IO.Directory.CreateDirectory(last_directory); } var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(Dictionary <string, КешЭлемент>), КешЭлемент.KnownTypeList()); foreach (var item in Items.AsParallel().GroupBy(p => Regex.Match(p.Key, @"(.+?):").Groups[1].Value)) { try { sb = new StringBuilder(); using (var xml = XmlWriter.Create(sb, settings)) { ser.WriteObject(xml, item.ToDictionary(p => p.Key, e => e.Value)); xml.Flush(); var file = System.IO.Path.Combine(directory, item.Key + ".cache"); if (ОставитьПредыдущююВерсию && System.IO.File.Exists(file)) { System.IO.File.Move(file, System.IO.Path.Combine(last_directory, item.Key + ".cache")); } System.IO.File.WriteAllText(file, sb.ToString()); System.Threading.Thread.Sleep(100); } } catch (Exception ex) { ConfigurationClient.WindowsLog(ex.ToString(), "", item.Key, "Cache.Сохранить"); } } } catch (Exception ex) { ConfigurationClient.WindowsLog(ex.ToString(), "", "system", "Cache.Сохранить"); } } }); if (!async) { task.Wait(); } }