예제 #1
0
        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:КешИдентификаторРаздела:&amp;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);
                        }
                    }
                }
            }
        }
예제 #2
0
        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();
            }
        }