// 装入一个日志文件中的若干记录 // parameters: // strStyle 如果包含 accessLog,表示这是需要获取只读日志 // strCacheDir 存储本地缓存文件的目录 // lServerFileSize 服务器端日志文件的尺寸。如果为-1,表示函数内会自动获取 // lSize 进度条所采用的最大尺寸。如果必要,可能会被本函数推动 // return: // -2 此类型的日志尚未启用 // -1 error // 0 正常结束 // 1 用户中断 static int ProcessFile( IWin32Window owner, Stop stop, ProgressEstimate estimate, LibraryChannel channel, string strLogFileName, int nLevel, long lServerFileSize, string strRange, string strStyle, string strCacheDir, object param, Delegate_doRecord procDoRecord, ref long lProgressValue, ref long lSize, out string strError) { strError = ""; int nRet = 0; long lRet = 0; stop.SetMessage("正在装入日志文件 " + strLogFileName + " 中的记录。" + "剩余时间 " + ProgressEstimate.Format(estimate.Estimate(lProgressValue)) + " 已经过时间 " + ProgressEstimate.Format(estimate.delta_passed)); bool bAccessLog = StringUtil.IsInList("accessLog", strStyle); string strXml = ""; long lAttachmentTotalLength = 0; byte[] attachment_data = null; long lFileSize = 0; if (lServerFileSize == -1) { lServerFileSize = 0; string strTempStyle = "level-" + nLevel.ToString(); if (bAccessLog) strTempStyle += ",accessLog"; // 获得服务器端日志文件尺寸 lRet = channel.GetOperLog( stop, strLogFileName, -1, // lIndex, -1, // lHint, strTempStyle, "", // strFilter out strXml, out lServerFileSize, 0, // lAttachmentFragmentStart, 0, // nAttachmentFramengLength, out attachment_data, out lAttachmentTotalLength, out strError); // 2015/11/25 if (lRet == -1) return -1; // 2010/12/13 if (lRet == 0) return 0; if (lServerFileSize == -1) { strError = "日志尚未启用"; return -2; } } Stream stream = null; bool bCacheFileExist = false; bool bRemoveCacheFile = false; // 是否要自动删除未全部完成的本地缓存文件 bool bAutoCache = StringUtil.IsInList("autocache", strStyle); if (bAutoCache == true) { nRet = PrepareCacheFile( strCacheDir, bAccessLog ? strLogFileName + ".a" : strLogFileName, lServerFileSize, out bCacheFileExist, out stream, out strError); if (nRet == -1) return -1; if (bCacheFileExist == false && stream != null) bRemoveCacheFile = true; } try { if (bCacheFileExist == true) lFileSize = stream.Length; else lFileSize = lServerFileSize; // stop.SetProgressRange(0, lTotalSize); if (String.IsNullOrEmpty(strRange) == true) strRange = "0-9999999999"; RangeList rl = new RangeList(strRange); for (int i = 0; i < rl.Count; i++) { RangeItem ri = (RangeItem)rl[i]; OperLogInfo[] records = null; long lStartRecords = 0; long lHint = -1; long lHintNext = -1; for (long lIndex = ri.lStart; lIndex < ri.lStart + ri.lLength; lIndex++) { Application.DoEvents(); if (stop != null) { if (stop.State != 0) { strError = "用户中断1"; goto ERROR1; } } if (lIndex == ri.lStart) lHint = -1; else lHint = lHintNext; if (bCacheFileExist == true) { if (lHint == -1) { // return: // -1 error // 0 成功 // 1 到达文件末尾或者超出 nRet = LocationRecord(stream, lIndex, out strError); if (nRet == -1) return -1; } else { // 根据暗示找到 if (lHint == stream.Length) break; if (lHint > stream.Length) { strError = "lHint参数值不正确"; return -1; } if (stream.Position != lHint) stream.Seek(lHint, SeekOrigin.Begin); } nRet = ReadCachedEnventLog( stream, out strXml, out lAttachmentTotalLength, out strError); if (nRet == -1) return -1; lHintNext = stream.Position; } else { if (records == null || lIndex - ri.lStart >= lStartRecords + records.Length) { int nCount = -1; if (ri.lLength >= Int32.MaxValue) nCount = -1; else nCount = (int)ri.lLength; string strTempStyle = "level-" + nLevel.ToString(); if (bAccessLog) strTempStyle += ",accessLog"; // 获得日志 // return: // -1 error // 0 file not found // 1 succeed // 2 超过范围,本次调用无效 lRet = channel.GetOperLogs( stop, strLogFileName, lIndex, lHint, nCount, strTempStyle, "", // strFilter out records, out strError); if (lRet == -1) { DialogResult result = MessageBox.Show(owner, strError + "\r\n\r\n是否继续处理?", "OperLogForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (result == DialogResult.No) goto ERROR1; else { // TODO: 是否要在listview中装入一条表示出错的行? lHintNext = -1; continue; } } if (lRet == 0) return 0; if (lRet == 2) break; // records数组表示的起点位置 lStartRecords = lIndex - ri.lStart; } OperLogInfo info = records[lIndex - lStartRecords]; strXml = info.Xml; lHintNext = info.HintNext; lAttachmentTotalLength = info.AttachmentLength; // 写入本地缓存的日志文件 if (stream != null) { try { WriteCachedEnventLog( stream, strXml, lAttachmentTotalLength); } catch (Exception ex) { strError = "写入本地缓存文件的时候出错: " + ex.Message; return -1; } } } #if NO // 2011/12/30 // 日志记录可能动态地增加了,超过了原先为ProgressBar设置的范围 if (lFizeTotalSize < (int)lHintNext) { lFizeTotalSize = lHintNext; stop.SetProgressRange(0, lFizeTotalSize); } #endif if (lHintNext >= 0) { // 校正 if (lProgressValue + lHintNext > lSize) { lSize = lProgressValue + lHintNext; stop.SetProgressRange(0, lSize); estimate.SetRange(0, lSize); } stop.SetProgressValue(lProgressValue + lHintNext); } if (lIndex % 100 == 0) { stop.SetMessage("正在装入日志文件 " + strLogFileName + " 中的记录 " + lIndex.ToString() + " 。" + "剩余时间 " + ProgressEstimate.Format(estimate.Estimate(lProgressValue + lHintNext)) + " 已经过时间 " + ProgressEstimate.Format(estimate.delta_passed)); } // if (procDoRecord != null) { nRet = procDoRecord(strLogFileName, strXml, bCacheFileExist, lHint, lIndex, lAttachmentTotalLength, param, out strError); if (nRet == -1) { DialogResult result = MessageBox.Show(owner, strLogFileName + " : " + lIndex.ToString() + "\r\n" + strError + "\r\n\r\n是否继续处理?", "OperLogForm", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (result == DialogResult.No) return -1; } if (nRet == 1) return 1; } } } // 创建本地缓存的日志文件的metadata文件 if (bCacheFileExist == false && stream != null) { nRet = CreateCacheMetadataFile( strCacheDir, bAccessLog ? strLogFileName + ".a" : strLogFileName, lServerFileSize, out strError); if (nRet == -1) goto ERROR1; } bRemoveCacheFile = false; // 不删除 } finally { if (stream != null) stream.Close(); if (bRemoveCacheFile == true) { string strError1 = ""; nRet = DeleteCacheFile( strCacheDir, bAccessLog ? strLogFileName + ".a" : strLogFileName, out strError1); if (nRet == -1) MessageBox.Show(owner, strError1); } } lProgressValue += lFileSize; return 0; ERROR1: return -1; }