您的位置:首页 > 编程语言 > C#

一个统计代码行数的程序C#

2011-12-25 12:10 465 查看
呼,从12月开始,开始学习,使用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();
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: