在前文 [源代码] - 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. C# book

    <编写高质量代码:改善C#程序的157个建议>源码下载 http://www.cnblogs.com/luminji/archive/2011/09/20/2182265.html < ...

  2. 2875: [Noi2012]随机数生成器 - BZOJ

    DescriptionInput 包含6个用空格分割的m,a,c,X0,n和g,其中a,c,X0是非负整数,m,n,g是正整数. Output 输出一个数,即Xn mod gSample Input ...

  3. Java多线程——<二>将任务交给线程,线程声明及启动

    一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...

  4. java.lang.NullPointerException&com.cb.action.LoginAction.execute(LoginAction.java:48)

    今天做一个Spring和Struts的融合,通过bean注入后,程序一跑起来,就报这个错误: java.lang.NullPointerException com.cb.action.LoginAct ...

  5. .htaccess文件讲解

    .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户 ...

  6. hdu1031 Design T-Shirt

    http://acm.hdu.edu.cn/showproblem.php?pid=1031 #include<iostream> #include<stdio.h> #inc ...

  7. SpringMVC学习总结(六)——SpringMVC文件上传例子(2)

    基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下使用SpringMVC进行表单上的文件上传以及多个文件同时上传的不同方法 一.配置文件: SpringMVC 用的是 的 ...

  8. Hibernate逍遥游记-第10章 映射继承关系-002继承关系树中的根类对应一个表(discriminator、subclass)

    1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...

  9. python 利用pop3接收邮件并保存附件

    def SaveAttach():# login the pop3 server ,retrive the new mails ,and download the attachments dstdir ...

  10. Csharp日常笔记

    1. 1.退出程序                   this.Close();             //方法退关闭当前窗口. Application.Exit();       //方法退出整 ...