在前文 [源代码] - 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. 搭建Asp.Net MVC4

    启动vs2012,开始创建一个新的web应用程序.使用菜单:“文件”>“新建项目” 请在左侧选择 Visual C#,然后选择ASP.NET MVC 4 Web 应用程序.命名您的工程为&quo ...

  2. 1458: 士兵占领 - BZOJ

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  3. Codeforces Round #327 (Div. 2) E. Three States

    题目链接: 题目 E. Three States time limit per test:5 seconds memory limit per test:512 megabytes 问题描述 The ...

  4. 【转载】错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll”--“拒绝访问。 ”

    win7中安装asp.net的问题 编译器错误信息: CS0016: 未能写入输出文件问题解决办法 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地 ...

  5. PHP之SQL防注入代码(360提供)

    <?php class sqlsafe { private $getfilter = "'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\ ...

  6. select count的优化

    select count的优化 2011-08-02 12:01:36 分类: Oracle 一般情况下,select count语句很难避免走全表扫描,对于上百万行的表这个语句使用起来就比较吃力了, ...

  7. 【QT】OpenCV配置

    很郁闷的表示我的opencv放在 D:\\program files  里面路径有个空格,导致我不得不把整个opencv又拷贝到了一个没有空格的路径下面命名为opencvForQt 网上有各种用CMa ...

  8. 套题T8&T9

    A - 8球胜负(eight) Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submi ...

  9. Minimum_Window_Substring两种方法求解

    题目描述: Given a string S and a string T, find the minimum window in S which will contain all the chara ...

  10. [itint5]最短路径遍历点

    http://www.itint5.com/oj/#50 此题有点难,参考了这篇文章,是个两条路的DP: http://blog.csdn.net/a83610312/article/details/ ...