读书人

有专家吗?给解决解决这个有关问题啊

发布时间: 2012-01-26 19:40:46 作者: rapoo

有专家吗?给解决解决这个问题啊!!
设计一个统计代码行数的工具
这个统计代码工具主要能够同时统计不同的语言。
要求:
每一种语言的代码行数、注释行数、空白行过滤,还有可能不是代码的不要统计进来。
每一种语言有不同的特色,要考虑能够适用各种语言。

还要考虑各种注释情况。从OOP角度考虑问题

实际例子:
---源代码目录
C#项目目录
VB项目目录
.
.
.
.

我只要选定源代码目录那么代码行数工具应该统计出如下表的数据(不包括测试目录和临时目录):

指标
语言总行数代码行数注释行数空白行设计行数(设计器生成)
C#
VB
……


那位专家能给画个类图啊,给小弟好好讲讲啊。。。先谢谢各位专家了


[解决办法]
这里有个代码行统计器
http://d.download.csdn.net/down/162620/sriong

核心代码

C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;namespace RecorderCount{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        public static string strFilePath="";        public  Int32 sumCount = 0;        public static StreamReader mysr;        public static string strFileType="";        private void btnExit_Click(object sender, EventArgs e)        {            this.Dispose();            Application.Exit();        }        private void btnOpenFile_Click(object sender, EventArgs e)        {            fbdFile.ShowNewFolderButton = true;            fbdFile.Description = "请选择源代码所在的文件位置";            fbdFile.ShowDialog();            if (fbdFile.SelectedPath.Length > 1)            {                txtFilePath.Text = fbdFile.SelectedPath.ToString();            }            else            {                MessageBox.Show("请选择源代码所在的文件夹!", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);                return;            }        }        private void btnCount_Click(object sender, EventArgs e)        {            if (richTextBox1.TextLength > 0)            {                richTextBox1.Clear();            }            if (txtFileType.Text.Length == 0)            {                MessageBox.Show("请输入要源代码文件的类型","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information );                return;            }            sumCount = 0;            DirectoryInfo di = new DirectoryInfo(@txtFilePath.Text.Trim());            if (cbxSubPath.Checked == true)            {                              if (di.Exists)                {                    int count=Info(di);                    richTextBox1.Text = richTextBox1.Text + "总计:                         " + count.ToString() + "\n\r";                    richTextBox1.Text = richTextBox1.Text + "OK\n\r";                }                       }            else            {                if (di.Exists)                {                    int count=currentInfo(di);                    richTextBox1.Text = richTextBox1.Text + "总计:                         " + count.ToString() + "\n\r";                    richTextBox1.Text = richTextBox1.Text + "OK\n\r";                }            }        }        private int  Info(DirectoryInfo di)        {            if (di.Exists)            {               DirectoryInfo[] di_list = di.GetDirectories();               FileInfo[] fiA=di.GetFiles(txtFileType.Text.Trim().ToString());//获得了所有起始目录下的文件               if (fiA.Length > 0)               {                   int totalCount = 0;                   richTextBox1.Text=richTextBox1.Text+"统计:"+ di.FullName.ToString() + ":\n\r";                                      for (int i = 0; i < fiA.Length; i++)                   {                       int count = 0;                       StreamReader sr = new StreamReader(di.FullName.ToString() + "\\" + fiA[i].Name.ToString());                       if (File.Exists(di.FullName.ToString() + "\\" + fiA[i].Name.ToString()))                       {                           string line = "";                           while ((line = sr.ReadLine()) != null)                           {                               count++;                           }                           richTextBox1.Text = richTextBox1.Text + fiA[i].Name.ToString() + "  " + count.ToString() + "\n\r";                           totalCount += count;                                              }                   }                   sumCount += totalCount;                   richTextBox1.Text=richTextBox1.Text+"小计:                         " + totalCount.ToString()+"\n\r";                   richTextBox1.Text = richTextBox1.Text + "--------------------------------------------\n\r";                                  }                                             foreach (DirectoryInfo di1 in di_list)                {                   DirectoryInfo[] di1_list = di1.GetDirectories();                    Info(di1);                }                                }             return sumCount;            }        private void Form1_Load(object sender, EventArgs e)        {            txtFileType.Text = "*.cs";            cbxSubPath.Checked = true;        }        private int currentInfo(DirectoryInfo di)        {            if (di.Exists)            {                DirectoryInfo[] di_list = di.GetDirectories();                FileInfo[] fiA = di.GetFiles(txtFileType.Text.Trim().ToString());//获得了所有起始目录下的文件                if (fiA.Length > 0)                {                    int totalCount=0;                    richTextBox1.Text = richTextBox1.Text + di.FullName.ToString() + ":\n\r";                    for (int i = 0; i < fiA.Length; i++)                    {                        int count = 0;                        StreamReader sr = new StreamReader(di.FullName.ToString() + "\\" + fiA[i].Name.ToString());                        if (File.Exists(di.FullName.ToString() + "\\" + fiA[i].Name.ToString()))                        {                            string line = "";                            while ((line = sr.ReadLine()) != null)                            {                                count++;                            }                            richTextBox1.Text = richTextBox1.Text  + fiA[i].Name.ToString() + "  " + count.ToString() + "\n\r";                            totalCount += count;                                                    }                    }                    sumCount += totalCount;                    richTextBox1.Text = richTextBox1.Text + "小计:                         " + totalCount.ToString() + "\n\r";                    richTextBox1.Text = richTextBox1.Text + "--------------------------------------------\n\r";                                   }             }            return sumCount;        }      }    } 


[解决办法]
你这个简直是一个小型软件, 在这个版面上恐怕写不下来吧?

1.写一个提取指定文件夹下所有文件名的程序(注意含子文件夹中文件)
2.写一个对文件扩展名进行筛选的程序, 要求仅保留特定扩展名的文件,
3.为C#,VB,等等其它各种语言, 分别编写一个分析代码行分解工具, 这个分解工具首先是将代码文件分成一个个的行, 注意VB以回车符为换行,C#以分号为换行(C#的注释则以回车为一个), 还可能一行中即有代码, 也有注释, 看你如何去计算而已
4.为每种语言的分析工具, 编程一个代码行内容辨认算法, 识别出该行是代码行, 空行, 注释行, 代码和注释混合行, 或其它行

这个工具软件, 写得比较专业一点的话, 一个星期内应该可以完成.
(是为学校作业写的, 还是为公司写的)



[解决办法]
- 学习了

读书人网 >.NET

热点推荐