前幾天,領導讓我找一下老系統(Java)里getRemoteUser方法都哪個文件用了,package是什麼,方法被調用了多少次,當時因為著急,所以,直接人工找的,但是以後要是再出現,人工找就太討厭了,畢竟程式員以懶著稱,因此,寫了一個小工具進行查詢。 一、效果圖 從圖中不難看出,現在的功能只能查詢 ...
前幾天,領導讓我找一下老系統(Java)里getRemoteUser方法都哪個文件用了,package是什麼,方法被調用了多少次,當時因為著急,所以,直接人工找的,但是以後要是再出現,人工找就太討厭了,畢竟程式員以懶著稱,因此,寫了一個小工具進行查詢。
一、效果圖
從圖中不難看出,現在的功能只能查詢兩類文件java和cs,畢竟是針對我們用的,如果想擴展的話,也是沒有問題的,畢竟方法是通用的。
最終得到的是一個excel
二、開發過程
1、首先建一個實體類
實體類裡面包含包名、文件名和使用次數
class ContentEntity { private string _paOrns; private string _fileName; private int useCount; /// <summary> /// package或者是NameSpace /// </summary> public string PaOrns { get { return _paOrns; } set { _paOrns = value; } } /// <summary> /// 文件名 /// </summary> public string FileName { get { return _fileName; } set { _fileName = value; } } /// <summary> /// 使用次數 /// </summary> public int UseCount { get { return useCount; } set { useCount = value; } } }實體類
2、截取欄位
因為要從Java文件里取出package後面的內容,CS文件里取出NameSpace後面的內容,因此需要用到截取欄位,這個小工具的開發並沒有用SubString來截取欄位,而是用的正則表達式
class Match { /// <summary> /// 獲取java的package /// </summary> /// <param name="str"></param> /// <returns></returns> public static string GetPackage(string str) { return Regex.Match(str, "(?<=package).*?(?=;)").Value; } /// <summary> /// 獲取C#的NameSpace /// </summary> /// <param name="str"></param> /// <returns></returns> public static string GetNamespace(string str) { return Regex.Match(str, "(?<=namespace).*?(?=\r)").Value; } /// <summary> /// 獲取文件名 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string GetFileName(string str) { return Regex.Match(str, "(?<=_).*?(?=_)").Value; } /// <summary> /// 獲取命名空間 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string GetPaOrNs(string str) { return Regex.Match(str, "^.*?(?=_)").Value; } }正則截取欄位
3、讀取文件夾下文件
迴圈遍歷選擇的文件夾路徑下的所有文件
/// <summary> /// 取得指定路徑下所有目錄及文件名稱(可遞歸) /// </summary> /// <param name="strDir">指定路徑</param> /// <param name="strFilePattern">要與 strDir 中的文件名匹配的搜索字元串 /// “*.abc*”返回擴展名為 .abc、.abcd、.abcde、.abcdef 等的文件。 /// “*.abcd”只返回擴展名為 .abcd 的文件。 /// “*.abcde”只返回擴展名為 .abcde 的文件。 /// </param> /// <param name="arrDirs">查詢得到的所有目錄</param> /// <param name="arrFiles">查詢得到的所有文件名稱</param> /// <param name="bIsRecursive">是否遞歸查詢</param> /// <returns></returns> private static List<string> GetFileList(string strDir, string strFilePattern, List<string> arrDirs, List<string> arrFiles, bool bIsRecursive) { DirectoryInfo dirInfo = new DirectoryInfo(strDir); if (string.IsNullOrEmpty(strDir)) return null; try { //取得指定路徑下的所有符合條件的文件 FileInfo[] strFiles = dirInfo.GetFiles(strFilePattern); //取得指定路徑下的所有目錄 DirectoryInfo[] strDirs = dirInfo.GetDirectories(); foreach (FileInfo item in strFiles) {//將所有文件名稱加入arrFiles中 arrFiles.Add(item.FullName); } foreach (DirectoryInfo item in strDirs) {//將所有目錄名稱加入arrDirs中 arrDirs.Add(item.FullName); } if (bIsRecursive) {//遞歸 if (strDirs.Length > 0) { foreach (DirectoryInfo item in strDirs) {//遞歸遍歷所有文件夾 GetFileList(item.FullName, strFilePattern, arrDirs, arrFiles, bIsRecursive); } } } } catch (Exception) { throw; } return arrFiles; }讀取文件夾下的文件
4、讀取需要的文件
讀取java或cs文件,並判斷裡面是否存在要搜索的關鍵字
/// <summary> /// 獲取包含查詢內容的集合 /// </summary> /// <param name="path">路徑</param> /// <param name="searchStr">要查詢的內容</param> public static List<ContentEntity> GetInfoIncludeSearchStr(string path, string searchStr, string type) { List<ContentEntity> ceList = new List<ContentEntity>(); ContentEntity ce; //獲取查詢內容的長度 int strLength = searchStr.Length; //包含路徑的所有集合 List<string> AllFile = GetFileList(path, type, new List<string>(), new List<string>(), true); foreach (string item in AllFile) { FileStream fs = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.None); StreamReader sr = new StreamReader(fs); //讀取文件的內容 string strLine = sr.ReadToEnd(); if (strLine.Length >= strLength) { for (int i = 0; i < strLine.Length - strLength; i++) { //判斷是否包含查詢的內容 if (strLine.Substring(i, strLength).Equals(searchStr)) { ce = new ContentEntity() { PaOrns = type == FileType.type_Java ? Match.GetPackage(strLine) : Match.GetNamespace(strLine),//判斷是哪種類型,選擇不同的處理方式 FileName = Path.GetFileName(item), UseCount = 1 }; ceList.Add(ce); } } } //關閉 sr.Close(); fs.Close(); } return ceList; }查詢關鍵字
5、導出到excel
將最終得到的結果導出到excel,並打開excel
public static void ExportExcel(System.Data.DataTable dt) { if (dt == null || dt.Rows.Count == 0) return; Application xlApp = new Application(); if (xlApp == null) return; CultureInfo CurrentCI = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Workbooks workbooks = xlApp.Workbooks; Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet worksheet = workbook.Worksheets[1]; Range range; long totalCount = dt.Rows.Count; long rowRead = 0; long percent = 0; for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; range = worksheet.Cells[1, i + 1]; range.Interior.ColorIndex = 15; } for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { try { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); } catch { worksheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString().Replace("=", ""); } } rowRead++; percent = (100 * rowRead) / totalCount; } worksheet.Columns.EntireColumn.AutoFit();//列寬自適應 worksheet.Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, " ", "Red", 15, MsoTriState.msoFalse, MsoTriState.msoTrue, 150, 200); xlApp.Visible = true; }導出excel
源碼過兩天上傳Github