在前文 [源代码] - C#代码搜索器 中我开发了一个代码搜索器. 我对其做的最后改动是将索引保存到磁盘中, 以备今后使用.

如今, 我在工作中又接到一项新任务: 有一个大项目, 其中10个负责数据访问的service即将被淘汰, 将会替换成entity framework的方式. 这10个service一共有近130个operation. 项目中所有调用这些operation的地方都必须被替换成新的EF方式. 整个项目有47902个cs文件. 现在要做个分析, 找到所有需要修改的地方.

稍作思考, 开工!

先创建一个console project, 引入WEBUS2.0 SDK. 将10个service和130个operation的信息放到字符串数组中:

static string[] DS_OP_List = new string[] {
"xxxxDS.CalculatePilotCloseOut",
"xxxxDS.CreatexxFirstAcont",
"xxxxDS.CreatexxUnallocatedULD",
"xxxxDS.xxCargoGetTare",
"xxxxDS.xxCargoCreateAbulk",
"xxxxDS.xxCargoDeleteAbulk",
"xxxxDS.xxCargoMoveAbulk"
...
}; //共130个, 公司有规定, 所以用xxx替代真实值 :)

然后打开Index (关于如何创建Index请参见前文:  [源代码] - C#代码搜索器), 再循环对operation进行搜索:

static void Main(string[] args)
{
IIndexer index = new IndexManager(); //构造索引对象
index.Open(@"C:\xxx\CodeSearch.Index", IndexOpenMode.Read); //以只读方式打开索引
ISearcher se = new IndexSearcher(index); //构造搜索对象
using (CSVFile csv = new CSVFile(@"c:\temp\xx_DS_Analysis.csv")) //将结果保存在csv文件中
{
foreach (var ds_op in DS_OP_List)
{
var key = ds_op.Split('.')[].ToLower(); //从Service.Operation中提取Operation, 比如从xxxxDS.CalculatePilotCloseOut中提取CalculatePilotCloseOut中提取
var hits = se.Search(string.Format("Code=\"{0}\"", key)); //搜索表达式: Code="CalculatePilotCloseOut"
Console.WriteLine("{0}/{1}", key, hits.Count);
foreach (HitDoc hit in hits)
{
csv.Write(ds_op, hit.GetDoc().GetField("FileName").Value.ToString()); //依次输出"服务名", "方法名", "文件名"到csv中
}
}
}
Console.ReadLine();
}

最后上一个生成CSV文件的工具类:

public class CSVFile : IDisposable
{
public string FileName { get; private set; }
private StreamWriter sw = null;
private StreamReader sr = null;
private FileStream fsWrite = null;
private FileStream fsRead = null; public CSVFile(string filename)
: this(filename, Encoding.UTF8, FileMode.OpenOrCreate)
{
} public CSVFile(string filename, FileMode mode)
: this(filename, Encoding.UTF8, mode)
{
} public CSVFile(string filename, Encoding encoding, FileMode mode)
{
this.FileName = filename;
fsWrite = new FileStream(filename, mode, FileAccess.Write, FileShare.Read);
fsWrite.Seek(, SeekOrigin.End);
fsRead = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
sw = new StreamWriter(fsWrite, encoding);
sr = new StreamReader(fsRead, encoding);
} public void Close()
{
sw.Close();
sr.Close();
} public string[] Read()
{
string text = sr.ReadLine();
if (string.IsNullOrEmpty(text))
{
return null;
}
return text.Split(',');
} public string[] FindNext(string startKeyword, StringComparison comparisonType = StringComparison.InvariantCultureIgnoreCase)
{
string[] result = null;
while ((result = this.Read()) != null)
{
if (result[].StartsWith(startKeyword, comparisonType))
{
return result;
}
else
{
continue;
}
}
return null;
} public void Write(params string[] values)
{
StringBuilder sb = new StringBuilder();
foreach (var v in values)
{
sb.Append(v + ",");
}
sw.WriteLine(sb.ToString().Substring(, sb.Length - ));
} public void Dispose()
{
this.Close();
}
}

ok, 大功告成! 运行:

[源代码] - C#代码搜索器 - 续的更多相关文章

  1. WEBUS2.0 In Action - [源代码] - C#代码搜索器

    最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...

  2. C#代码搜索器

    WEBUS2.0 In Action - [源代码] - C#代码搜索器 最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++ ...

  3. 开源代码搜索器searchcode

    项目主页:https://searchcode.com/ 查看API:https://searchcode.com/api/ 关于:https://searchcode.com/about/ Sear ...

  4. java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器

    java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...

  5. 推荐一个C#代码混淆器 .NET Reactor【转】

    C#的代码辛苦写出来之后,一个反射工具,就可以完全显露出来. 当然,在做项目时,这个功能还不错.因为我就曾在一个项目上使用C#,没有进行任何混淆.结果在项目二年多之后,需要做一些调整,自己保存的源代码 ...

  6. 混淆器:java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器

    java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...

  7. 一个比ack速度快n倍的代码搜索工具: ag

    一个比ack速度快n倍的代码搜索工具:  ag 银搜索者(The Silver Searcher) 一个类似于代码搜索工具ack,着重于速度. Github:   https://github.com ...

  8. html 音乐 QQ播放器 外链 代码 播放器 外链 代码

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha QQ播放器 外链 代码 播放器 外链 代码 ======== 歌曲链接 QQ播放器 外链 ...

  9. 利用 vuex 实现一个公用搜索器

    安装 npm i vuex vuex 的使用 先创建好如图所示的文件: 编写 modules 下的 params.js const param = { state: { params: {} }, m ...

随机推荐

  1. JQuery,UIbootstrap风格弹出层

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  2. 2013 Asia Regional Changchun

    Hard Code http://acm.hdu.edu.cn/showproblem.php?pid=4813 #include<cstdio> ]; int main(){ int t ...

  3. Unit Test Generator

           

  4. jquery easyui datagrid 获取选中多行

    var rows = $('#dataTable').datagri('getSelections');

  5. Tower of Hanoi问题

    [问题描述] 有A, B, C三个塔座,A上套有n个直径不同的圆 盘,按直径从小到大叠放,形如宝塔,编号1, 2, 3 … n. 要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循 下列原则: w ...

  6. spoj 1108

    要求输出一个牌的顺序 使每隔1.2.......n翻牌后出现1 2 3 4 5 6 7 8 9 .... n 将牌想象成n个空格  正向推 空n个位置放n 循环 需优化 #include <io ...

  7. gdb基本使用方法

    gdb时linux下的一个非常好用的调试工具.下面给出它几个常用的方法 b 设置断点.c 继续执行. i 查看一些信息,比如断点,i b. bt 查看函数调用栈. n 执行下一条指令,但不会进入到调用 ...

  8. Appium绑定

    锁定 锁定屏幕 # python driver.lock(5) 将 app 置于后台 把当前应用放到后台去 # python driver.background_app(5) 收起键盘 收起键盘 # ...

  9. JSP include标签和include指令

    test1.jsp <% int a = 5; out.println(a); %> test2.jsp <jsp:include page="/test1.jsp&quo ...

  10. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...