// 后续记录需要过滤掉未变化的重复项 private void SaveBeanForOtherRecord(RecordBean bean, RecordBean[] childDirBeans) { RecordBean targetBean = Extend.GetLastBean(bean.Path); if (targetBean == null) { bean.IsChange = true; } else { bean.IsChange = bean.IsChange || !bean.Equals(targetBean); } //如果该bean没有变化,则不再记录 if (bean.IsChange) { bean.Id = RecordMapper.AddOne(bean, incidentId, false); beanCount++; //刷新索引 DirIndexMapper.RefreshIndex(new DirIndexBean() { Path = bean.Path, IncidentId = incidentId, TargectId = bean.Id, }); foreach (RecordBean dirBean in childDirBeans) { if (dirBean.IsChange) { RecordMapper.SetParentId(dirBean.Id, bean.Id, incidentId); } else { //将未改变的bena也记录下来 dirBean.ParentId = bean.Id; RecordMapper.AddOne(dirBean, incidentId, false); beanCount++; } } } else { //为未改变节点添加索引 bean.IncidentId = targetBean.IncidentId; bean.TargetId = targetBean.Id; } }
//通过路径获取最新的记录节点 internal static RecordBean GetLastBean(string path) { DirIndexBean dirIndex = DirIndexMapper.GetOneByPath(path); if (dirIndex == null) { return(null); } RecordBean bean = RecordMapper.GetOneById(dirIndex.TargectId, dirIndex.IncidentId); if (bean == null) { return(null); } //告知该bean是属于哪一个事件的 bean.IncidentId = dirIndex.IncidentId; return(bean); }
// 第一次记录 private void SaveBeanForFirstRecord(RecordBean bean, RecordBean[] childDirBeans) { //记录并获取当前id bean.Id = RecordMapper.AddOne(bean, incidentId, true); //记录索引 DirIndexMapper.AddOne(new DirIndexBean() { Path = bean.Path, IncidentId = incidentId, TargectId = bean.Id, }); beanCount++; //设置子一级的父id foreach (RecordBean dirBean in childDirBeans) { RecordMapper.SetParentId(dirBean.Id, bean.Id, incidentId); } }
public void AddOne(object obj) { DateTime startTime = DateTime.Now; Thread.Sleep(1000); object[] objs = (object[])obj; ProgramWindow programWindow = (ProgramWindow)objs[0]; IncidentBean bean = (IncidentBean)objs[1]; programWindow.WriteLine("初始化..."); try { //处理事件 bean.CreateTime = DateTime.Now; bean.State = 1; incidentId = IncidentMapper.AddOne(bean); isFirst = IncidentMapper.IsFirstRecord(); //第一次记录必须保证索引表为空 if (isFirst) { DirIndexMapper.CleanAll(); } //新建记录表 Extend.BuildTable(incidentId, isFirst); programWindow.WriteLine("开始记录硬盘使用空间..."); programWindow.WriteLine("(建议此时不要修改硬盘上的文件,以免影响最终的分析结果)"); programWindow.Freeze(); isRunning = true; Thread showProgress = new Thread(ShowProgress) { Name = "showProgress" }; showProgress.Start(programWindow); DriveInfo[] drives = DriveInfo.GetDrives(); //遍历分区 foreach (DriveInfo drive in drives) { DirectoryInfo rootDir = new DirectoryInfo(drive.Name); SeeDirectory(rootDir, 0); } isRunning = false; programWindow.WriteAll("记录完成,建立索引...\n"); Extend.BuildIndex(incidentId); //收尾工作 long count = RecordMapper.Count(incidentId); IncidentMapper.SetStateById(incidentId, 0); if (isFirst) { //删除以前记录失败的作废表格 Extend.DeleteErrorTable(incidentId); } TimeSpan consumption = DateTime.Now - startTime; Log.Info(string.Format("数据记录完成, 记录:{0}({1}), 耗时:{2}", count, beanCount, consumption)); programWindow.WriteLine(string.Format("数据记录完成,耗时:{0}小时{1}分。", consumption.Days * 24 + consumption.Hours, consumption.Minutes)); programWindow.RunOver(); } catch (Exception e) { Log.Add(e); isRunning = false; programWindow.WriteLine("\n错误:"); programWindow.WriteLine(e.Message); programWindow.RunOver(); //throw e; } }