一个统计代码行数的程序C#
2011-12-25 12:10
465 查看
呼,从12月开始,开始学习,使用C#了.还好自己之前是学过C和C++,学起来不那么困难.特性很多,没有贪多地去掌握.
在项目里,暂时没有我什么事,自己在那,学习引擎,看服务端和客户端的代码.每天就是自己给自己找事情做,不然就会枯燥.有的时候啊,会比较闷的,忍咯,比从前的日子还是好过度多了.
这种程序,很久以前写过一个.是用C写的.这个呢,是C#,比C的功能多了许多.这个语言还是不错,纯面向对象.
不多说了,好久没有写博了,今天终于有机会,写一个了.今天是那个西方的节日,没我什么事,呵呵.不多说了,帖.
在项目里,暂时没有我什么事,自己在那,学习引擎,看服务端和客户端的代码.每天就是自己给自己找事情做,不然就会枯燥.有的时候啊,会比较闷的,忍咯,比从前的日子还是好过度多了.
这种程序,很久以前写过一个.是用C写的.这个呢,是C#,比C的功能多了许多.这个语言还是不错,纯面向对象.
不多说了,好久没有写博了,今天终于有机会,写一个了.今天是那个西方的节日,没我什么事,呵呵.不多说了,帖.
// Program.cs -- 2011-12-14-16.35 using System; using System.IO; namespace CountLines { // 统计单个文件信息 public class CountFileInfo { private bool m_ignoreCommentary; // 是否忽略注释 private StreamReader m_reader; // 文件读流 private int m_charNum = 0; // 字符数 private int m_lineNum = 0; // 行数 private string m_fileName; // 文件名 // 私有方法 private void m_countALine(string aLine) { // 如果忽略注释并且在aLine中出现了"//" if (m_ignoreCommentary && aLine.Contains(@"//")) { for (int i = 0; i != aLine.Length; ++i) { if (aLine[i] == '/' && i < aLine.Length - 1 && aLine[i + 1] == '/') return; else ++m_charNum; } } else { foreach (char c in aLine) { // 跳过空格 if (c != ' ') { ++m_charNum; } } } } // 公有方法 public CountFileInfo(bool ignoreCommentary = true) { m_ignoreCommentary = ignoreCommentary; } public void Initialize(StreamReader reader, string fileName) { m_reader = reader; m_charNum = 0; m_lineNum = 0; m_fileName = fileName; } public void Count() { string buff = m_reader.ReadLine(); while (buff != null) { // 忽略空行 if (buff.Length != 0) { ++m_lineNum; m_countALine(buff); } buff = m_reader.ReadLine(); } } public int CharNum { get { return m_charNum ; } } public int LineNum { get { return m_lineNum ; } } public string FileName { get { return m_fileName ; } } } // 统计所有文件以及目录信息 public class CountGlobalInfo { private uint m_fileNum; // 文件总数 private uint m_charNum; // 总字符数 private uint m_lineNum; // 总行数 public CountGlobalInfo() { m_fileNum = 0; m_charNum = 0; m_lineNum = 0; } public void AddAFile(CountFileInfo countFileInfo) { ++m_fileNum; m_charNum += (uint) countFileInfo.CharNum; m_lineNum += (uint) countFileInfo.LineNum; } public uint FileNum { get { return m_fileNum; } } public uint CharNum { get { return m_charNum; } } public uint LineNum { get { return m_lineNum; } } } public class WriteResult { private string m_indentBuff ; private StreamWriter m_writer; public WriteResult(string targetDirectory) { m_writer = new StreamWriter("统计结果.txt", false) ; } private void m_processIndent(int indentLevel) { m_indentBuff = null ; for (int i = 0; i != indentLevel; ++i) { m_indentBuff += " " ; } } public void go(CountFileInfo countFileInfo, int indentLevel) { m_processIndent(indentLevel); m_writer.WriteLine(m_indentBuff + "文件: " + countFileInfo.FileName) ; m_writer.WriteLine(m_indentBuff + "行: " + countFileInfo.LineNum.ToString()) ; m_writer.WriteLine(m_indentBuff + "字符:" + countFileInfo.CharNum.ToString()); m_writer.WriteLine(""); } public void go(CountGlobalInfo countGolbalInfo) { m_writer.WriteLine("文件总数: " + countGolbalInfo.FileNum.ToString()) ; m_writer.WriteLine("全部行数: " + countGolbalInfo.LineNum.ToString()) ; m_writer.WriteLine("全部字符数:" + countGolbalInfo.CharNum.ToString()); } public void Save() { m_writer.Close(); } } // 遍历以根目录为根的目录树 public class Travel { private DirectoryInfo m_rootDirectory; // 根目录 private string m_Extension; // 文件名后缀,即文件类型 CountFileInfo m_countFileInfo; // 统计文件类的实例 CountGlobalInfo m_countGlobalInfo; // 统计全局信息类的实例 WriteResult m_writeResult; // 写统计结构类的实例 int m_indentLevel = 0; // 缩进数 // 公有方法 public Travel(string rootDirectory, string extension = ".cs", bool ignoreCommentary = true) { m_rootDirectory = new DirectoryInfo(rootDirectory); if (m_rootDirectory == null) { throw new System.Exception("无效的当前目录名!"); } m_countFileInfo = new CountFileInfo(ignoreCommentary); m_countGlobalInfo = new CountGlobalInfo(); m_writeResult = new WriteResult(rootDirectory); m_Extension = extension; } public void go(DirectoryInfo currentDirectory) { // 统计当前目录下的所有文件 foreach (FileInfo file in currentDirectory.GetFiles()) { if (file.Extension == m_Extension) { // 统计指定的文件类型 StreamReader reader = file.OpenText(); m_countFileInfo.Initialize(reader, file.Name); m_countFileInfo.Count(); m_countGlobalInfo.AddAFile(m_countFileInfo); m_writeResult.go(m_countFileInfo, m_indentLevel); reader.Close(); } } ++m_indentLevel; // 获取当前目录下的所有子目录 DirectoryInfo[] subDirectories = currentDirectory.GetDirectories(); foreach (DirectoryInfo directory in subDirectories) { go(directory); } --m_indentLevel; if (m_indentLevel == 0) { // 打印最终全局统计结果. m_writeResult.go(m_countGlobalInfo); m_writeResult.Save(); } } public DirectoryInfo RootDirectoryInfo { get { return m_rootDirectory; } } } public class program { public static void Main() { Console.WriteLine( "此程序可以统计出所在文件夹及其子文件夹中所有文件的行数和字符数信息\n" + "忽略所有注释,并将在本程序所在文件夹生成一个存放统计结果的文件\n" + "\"统计结果.txt\".单击回车键开始统计."); Console.ReadKey(); Console.WriteLine("\n开始统计,请耐心等候..."); Travel travel = new Travel(Directory.GetCurrentDirectory()); travel.go(travel.RootDirectoryInfo); Console.WriteLine("统计完毕,已将统计结果写入\"统计结果.txt\"文件中."); Console.WriteLine("单击回车退出程序."); Console.ReadKey(); } } }
相关文章推荐
- 分享一个用于统计MATLAB代码行数的小程序
- 一个简单的统计C源程序代码行数的小程序
- C#统计C、C++及C#程序代码行数的方法
- 一个统计代码行数的程序C语言
- 恩,屡试不爽,再写一个统计C#代码行数的宏
- 一个简单的统计代码行数的程序(基于MFC)
- 写一个程序,统计自己C语言共写了多少行代码,Github基本操作
- ASPX验证码生成程序(C#代码一个页面实现)
- 统计一个项目的代码行数,只统计cpp文件
- [Java] 正则表达式 02 EmailSpider 抓邮件, CodeCounter 统计程序有效代码行数
- C#代码写的一个计算器的小程序
- 统计项目代码行数程序
- 一个用shell写的统计目录下统计文件行数的代码
- 用C#设计一个驱动备份的程序代码
- 一个统计代码行数的简单方法
- 简单代码实现C#中运行另外一个程序
- 小脚本,统计一个目录下满足特定条件文件的代码行数
- C#程序员统计自己的代码行数
- 编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事
- c#代码统计程序