/// <summary> /// 这个方法会被递归调用,所以要小心调用。 /// </summary> /// <param name="folderFullName"></param> /// <param name="parentTree"></param> private void CopyAndImportLocalDirectory(DirectoryInfo folderFullName, CodeFolder parentTree = null) { var codeTree = new CodeFolder(); codeTree.Id = Guid.NewGuid().ToString(); codeTree.Text = folderFullName.Name; if (parentTree != null) { codeTree.ParentId = parentTree.Id; } copyFolderList.Add(folderFullName.FullName, codeTree); FileSystemInfo[] subFiles = folderFullName.GetFiles(); var count = 0; foreach (FileInfo item in subFiles) { if (!item.Exists) { continue; } if (!SAPINT.Gui.Util.FileUtil.IsTextFile(item.FullName)) { continue; } StreamReader sr = new StreamReader(item.FullName, Encoding.Default); String s = sr.ReadToEnd(); sr.Close(); //if (s.Length > 3*1024 * 1024) //{ // continue; //} var code = new Code(); code.Title = item.Name; code.Content = s; // code.Content = s.Replace("UTF-8", "GB2312"); code.TreeId = codeTree.Id; copyCodeList.Add(code); count++; setProcessBar(subFiles.Count(), count, folderFullName.FullName, item.Name); //为了提高性能,每超过100个文档就保存一次。 //因为每个文档内容都包含内容,如果文档的大小超过1M,那100 //个文档会就100M的内存消耗。 //如果没有超过100个文档在方法递归完成后再保存。 if (copyCodeList.Count == 100) { db.SaveCodeList(copyCodeList); db.SaveFolderList(copyFolderList); copyCodeList.Clear(); copyFolderList.Clear(); } } var subDirectories = folderFullName.GetDirectories(); if (subDirectories.Count() > 0) { foreach (var item in subDirectories) { if (item.Exists) { CopyAndImportLocalDirectory(item, codeTree); } } } }
private bool LoadObjectFromSap(BackgroundWorker bw, bool Saved = true) { List <Code> list = new List <Code>(); Dictionary <int, Code> pos = new Dictionary <int, Code>(); this.AbapCode = new SAPINT.Utils.ABAPCode(SapSysName); var itemCount = 0; var processed = 0; var m_isCacelling = false; foreach (DataRow item in dt.Rows) { if (this.backgroundWorker1.CancellationPending) { m_isCacelling = true; } if (String.IsNullOrWhiteSpace(item["Select"].ToString())) { continue; } var isSelect = (bool)item["Select"]; if (isSelect) { var obj = item["NAME"].ToString(); if (String.IsNullOrEmpty(obj)) { continue; } var codes = AbapCode.GetSourceCode(obj); var sb = new StringBuilder(); codes.ForEach(x => sb.AppendLine(x)); item["Lines"] = codes.Count; var abapCode = sb.ToString(); item["Length"] = Util.FileUtil.FormatFileSize(abapCode.Length); item["Header"] = abapCode; if (String.IsNullOrEmpty(abapCode)) { continue; } var comments = new StringBuilder(); foreach (var comment in codes) { if (comment.StartsWith("*")) { comments.AppendLine(comment); } if (comments.ToString().ToList().Count > 10) { break; } } Code code = new Code(); code.Content = abapCode; code.Desc = comments.ToString(); code.Title = obj; if (!String.IsNullOrEmpty(this.TreeId)) { code.TreeId = TreeId; } list.Add(code); var index = int.Parse(item["Index"].ToString()); pos.Add(index, code); var pTime = new System.TimeSpan(pauseTime); Thread.Sleep(pTime);//必须暂停,因为在SAP系统中读取程序不会那么快。 //每100行保存一次 itemCount++; if (itemCount == 100 && dt.Rows.Count >= 100 && m_isCacelling == false) { if (true == Saved) { this.cbxDbSources.Enabled = false; db.SaveCodeList(list); this.cbxDbSources.Enabled = true; } foreach (var positem in pos) { dt.Rows[positem.Key]["CodeId"] = positem.Value.Id; dt.Rows[positem.Key]["Select"] = false; } pos.Clear(); list.Clear(); itemCount = 0; } else { if (true == Saved) { this.cbxDbSources.Enabled = false; db.SaveCodeList(list); this.cbxDbSources.Enabled = true; } foreach (var positem in pos) { dt.Rows[positem.Key]["CodeId"] = positem.Value.Id; dt.Rows[positem.Key]["Select"] = false; } pos.Clear(); list.Clear(); itemCount = 0; } processed++; ImportMessage m = new ImportMessage() { current = processed, total = selectedItems, progName = obj }; bw.ReportProgress(processed, m); //如果要取消,保存后退出. if (m_isCacelling == true) { break; } } } return(true); //if (db.SaveCodeList(list)) //{ // foreach (var item in pos) // { // dt.Rows[item.Key]["CodeId"] = item.Value.Id; // } // return true; //} //else //{ // return false; //} }