public static void WriteCache(this TabPageEntity page) { string path = page.GetRecordPath(true); System.IO.StringWriter sw = new System.IO.StringWriter(); //创建一个序列化对像 System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(TabPageEntity)); //写入缓存文件 System.IO.File.WriteAllBytes(path, Compression.Compress(System.Text.UnicodeEncoding.Unicode.GetBytes(sw.ToString()))); page.Modifyd = false; page.Issync = true; }
/// <summary> /// 得到生成页面文件的路径 /// </summary> /// <param name="page">页面文件代码</param> /// <param name="IsCacheFile">是不是返回页面缓存文件的路径 默认为false</param> /// <returns>返回生成页面文件的路径</returns> public static string GetRecordPath(this TabPageEntity page, bool IsCacheFile = false) { //得到生成文件的路径 //基本路径 string basePath = AppDomain.CurrentDomain.BaseDirectory + page.Record.分类标识.ToPingYing() + "/" + page.Record.书名.ToPingYing() + "/" + page.Record.ID; string htmlPage = System.IO.Path.GetFullPath(basePath + ".html"); string cachePage = System.IO.Path.GetFullPath(basePath + ".zip"); if (IsCacheFile) { return(cachePage); } return(htmlPage); }
/// <summary> /// 更新页面记录 /// </summary> /// <param name="page"></param> public void UpdateRecord(TabPageEntity page) { //如果文件不同步则 if (!page.IsTabPageEntitySync()) { try { //将记录写入缓存 page.WriteCache(); } //如果写入失败则过一会儿再写入 catch { System.Threading.Tasks.Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(1); page.WriteCache(); }); } } }
/// <summary> /// 比较当前记录是不是与硬盘上的记录相等 /// </summary> /// <param name="page">页对像实体</param> /// <param name="path">文件所在的路径</param> /// <returns></returns> public static bool IsTabPageEntitySync(this TabPageEntity page) { //如果文件不存在直接返回 false if (!System.IO.File.Exists(page.GetRecordPath(true))) { return(false); } //实始化buff byte[] bytearr = new byte[10]; //锁住读写文件时使用 lock (page) { //读取缓存文件内容 //如果多线程操作可能会引发文件访问异常,这里需要对,访问对象进行控制 bytearr = System.IO.File.ReadAllBytes(page.GetRecordPath(true)); } //得到Zip文件解压缩后的数据 bytearr = Compression.DeCompress(bytearr); //得到需要序列化的字符串 string Text = System.Text.UnicodeEncoding.Unicode.GetString(bytearr); //创建一个序列化对像 System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(TabPageEntity)); //得到文中得到的Page 对象 TabPageEntity diskPage = (TabPageEntity)xmlSerializer.Deserialize(new System.IO.StringReader(Text)); if ( diskPage.Book.Record.GUID == page.Book.Record.GUID && diskPage.Book.Record.ID == page.Book.Record.ID && diskPage.Book.Record.创建时间 == page.Book.Record.创建时间 && diskPage.Book.Record.分类标识 == page.Book.Record.分类标识 && diskPage.Book.Record.分类表ID == page.Book.Record.分类表ID && diskPage.Book.Record.书名 == page.Book.Record.书名 && diskPage.Book.Record.说明 == page.Book.Record.说明 && diskPage.Book.Record.完本 == page.Book.Record.完本 && diskPage.Book.Record.周点击 == page.Book.Record.周鲜花 && diskPage.Book.Record.周鲜花 == page.Book.Record.周鲜花 && diskPage.Book.Record.总点击 == page.Book.Record.总点击 && diskPage.Book.Record.总鲜花 == page.Book.Record.总鲜花 && diskPage.Book.Record.最后更新时间 == page.Book.Record.最后更新时间 //分类比较结束 开始内容比较 && diskPage.Record.ID == page.Record.ID && diskPage.Record.本记录GUID == page.Record.本记录GUID && diskPage.Record.最后访问时间 == page.Record.最后访问时间 ) { return(true); } else { return(false); } }
public void UpdateRecord(RecordType recordType, string sign) { //得到枚举选项 List <RecordType> result = EnumExtendMethod.GetEnumArray <RecordType>(recordType); decimal d; if (result.Count > 0) { switch (result[0]) { case RecordType.Page: Func <TygModel.文章表, bool> fun = null; //如果是数据ID if (decimal.TryParse(sign, out d)) { fun = p => p.ID == d; } else { fun = p => p.GUID == Guid.Parse(sign); } //得到对应的记录 var records = tygdb.文章表.Where(fun); //初始化当前访问的页面 TabPageEntity page = null; if (records.Count() > 0) { var record = records.FirstOrDefault(); #region 初始化页面对象数据 //如果当前缓存记录中存在这条记录 if (!BooksCache.ContainsKey(record.书名表.GUID.ToString())) { //页面所在的分类 TabClassEntity Typeclass = null; //如果包括分类 if (ClassesCache.ContainsKey(record.书名表.分类表.ID)) { Typeclass = ClassesCache[record.书名表.分类表.ID]; } else { Typeclass = new TabClassEntity() { Modifyd = true, }; Typeclass.Record = record.书名表.分类表; //添加到分类表 ClassesCache.TryAdd(Typeclass.Record.ID, Typeclass); } //实例化书对像 TabBookEntity book = new TabBookEntity() { Record = record.书名表, Typeclass = Typeclass, Modifyd = true, }; //尝试添加到数据中 ClassesCache[record.书名表.分类表.ID].Books.TryAdd(record.书名表.GUID.ToString(), book); //如果不包含 if (!book.Pages.ContainsKey(sign)) { page = new TabPageEntity() { Book = book, Issync = false, Modifyd = true, Record = record }; //将页面添加到缓存集合 book.Pages.TryAdd(record.本记录GUID.ToString(), page); } //添加到书的缓存集合 BooksCache.TryAdd(record.书名表.GUID.ToString(), book); } #endregion //得到书本对象的数据 page = BooksCache[record.书名表.GUID.ToString()].Pages[record.本记录GUID.ToString()]; page.Record.总访问次数++; page.Record.最后访问时间 = DateTime.Now; page.Record.书名表.总点击++; page.Record.书名表.周点击++; } break; case RecordType.Book: Func <TygModel.书名表, bool> bookfun = null; //如果是数据ID if (decimal.TryParse(sign, out d)) { bookfun = p => p.ID == d; } else { bookfun = p => p.GUID == Guid.Parse(sign); } //得到对应的记录 var bookrecords = tygdb.书名表.Where(bookfun); if (bookrecords.Count() > 0) { var record = bookrecords.FirstOrDefault(); #region 初始化页面对象数据 //如果当前缓存记录中存在这条记录 if (!BooksCache.ContainsKey(record.GUID.ToString())) { //页面所在的分类 TabClassEntity Typeclass = null; //如果包括分类 if (ClassesCache.ContainsKey(record.分类表.ID)) { Typeclass = ClassesCache[record.分类表.ID]; } else { Typeclass = new TabClassEntity() { Modifyd = true, }; Typeclass.Record = record.分类表; //添加到分类表 ClassesCache.TryAdd(Typeclass.Record.ID, Typeclass); } //实例化书对像 TabBookEntity book = new TabBookEntity() { Record = record, Typeclass = Typeclass, Modifyd = true, }; BooksCache.TryAdd(record.GUID.ToString(), book); } //更新状态 BooksCache[record.GUID.ToString()].Modifyd = true; #endregion record.总点击++; record.周点击++; } break; case RecordType.ClassEntity: break; } } #region 查看记录不是不和缓存数据中的记录相等 如果不相当则更新较旧的记录 #endregion }