65.9K
CodeProject 正在变化。 阅读更多。
Home

C#中计算代码行数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.56/5 (29投票s)

2004 年 12 月 19 日

3分钟阅读

viewsIcon

129471

downloadIcon

5674

一篇关于递归统计给定目录中文件代码行数的文章。

引言

我向您展示一个能够... 统计行数的工具!

哇!您惊叹道,一边后退试图恢复平衡。没错,我的朋友们,恐怕今天没有什么突破性的东西。

但是,话虽如此,我不得不创建这个工具,因为我无法轻易找到任何其他可以满足我需求的东西。因此,如果您能忍受我,您可能会发现这段代码对您有用。

本文有两个部分您可能会感兴趣。第一个是 DirectoryLineCounter。这是文章的核心,是一个简单的类,它将递归地从给定目录中的文件子集中提取行数。

下载中第二个有趣的部分是使用 DirectoryLineCounter 的应用程序。这个应用程序让我们能够快速地计算出我们的存储库的各个部分到底包含了多少代码。

这些信息对我们很有用,可以识别出人们在我们的科学框架中创建最多代码的地方。我们希望看到大部分代码工作都投入到科学的创造中,但相反,我们看到使用科学框架的应用程序(GUI)记录的代码行数最多。

行数统计引擎

我们最初使用一个简单的 linecounter (grep/script) 来给出我们整个存储库中的总行数,但这并没有真正给我们任何有用的信息,说明存储库的哪些区域包含的代码最多。因此,我们创建了这个简单的类,它能够递归到目录中并以结构化的方式报告信息。

DirectoryLineCounter 类有两个静态数组,DirectoryIgnoreNamesFileSearchPatterns。这些是要忽略的目录(例如 bindebug.cvs.svn ...),以及要计算的文件类型(例如 *.cs*.h*.vb ...)。将它们作为静态字段对我们来说很好,因为 DirectoryLineCounter 始终只打算在一次运行中汇总一个目录(及其子目录)。做一个简单的更改,将成员字段设为参数并将其传递给递归运行即可。

一旦设置了 DirectoryIgnoreNamesFileSearchPatterns 字段,DirectoryLineCounter 就可以通过调用 countLines() 方法来产生一些有用的结果。完成后,DirectoryLineCounter 将包含两个计数,一个用于在其指向的目录中找到的代码行数 (DirectoryLines),另一个用于在所有子目录中找到的总行数 (SubDirectoriesTotalLines)。DirectoryLineCounter 还包含一个 DirectoryLineCounter 列表,这些 DirectoryLineCounter 代表初始目录中的所有子目录,这个数组是 SubDirectoryCounters 字段。

最后可能需要解释的是 FilesCompleted 事件。每当 DirectoryLineCounter 完成从其目录中的所有文件计数时,就会触发此事件。然后,它在事件中传回刚刚完成的文件数。这对于向用户提供该过程的进度很有用。

DirectoryLineCounter 被放入一个单独的项目 (LineCountEngine) 中,以便可以轻松地从同一个项目创建多个应用程序。我打算编写一个命令行应用程序,该应用程序也将利用 LineCountEngine,但鉴于目前的时间限制,这不太可能发生。

至于性能,我不知道什么是好的,但我可以告诉你,总结我们大约 650,000 行的存储库大约需要 10 秒钟。这对我们来说不是问题。

行数统计应用程序

行数统计应用程序只是简单地使用了 LineCountEngine。您告诉它从哪里开始并按 Go,应用程序然后使用 DirectoryLineCounter 返回的信息构建一个目录树。

感谢 Julijan Sribar 使用他的 PieChart 组件。您可以在这里看到他的文章。

© . All rights reserved.