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

代码统计工具(支持C#,VB.NET)

2008-03-31 11:26 357 查看
小玩意,不多说,想看的一看就会,

界面如下:



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 代码行数统计工具
{
public partial class frmCountCodes : Form
{
string curDir="";//当前目录
string wrfile = "";//代码写入的文件
string filter = "";//要查找的文件类型
bool chtxt = false;//是否手动更改目录
//private delegate void desearch(string str);//查找委托
long count = 0;//行数
int filecount = 0;//发现文件个数
StringBuilder strinfo;//返回信息
bool ischeck = false;//是否为连续多行的注释 如C#中的 /*...*/
public frmCountCodes()
{
InitializeComponent();
}
/// <summary>
/// 设置目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDir_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "选择要统计的文件所在目录";
fbd.RootFolder =Environment.SpecialFolder.MyComputer;
fbd.ShowNewFolderButton = false;
fbd.ShowDialog();
if (fbd.SelectedPath.Trim() != "")
{
curDir = fbd.SelectedPath;
txtDir.Text = curDir;
}
}

private void txtDir_TextChanged(object sender, EventArgs e)
{
chtxt = true;
}

private void txtDir_Leave(object sender, EventArgs e)
{
if (chtxt)
{
if (Directory.Exists(txtDir.Text.Trim()))
{
curDir = txtDir.Text.Trim();
}
else
{
MessageBox.Show("此并不是一个有效的目录!请重新设置。");
txtDir.Text = curDir;
}
}
}

//统计
private void btnser_Click(object sender, EventArgs e)
{
try
{
btnser.Enabled = !btnser.Enabled;
if (!Directory.Exists(curDir))
{
MessageBox.Show("此并不是一个有效的目录!请重新设置。");
btnser.Enabled = !btnser.Enabled;
return;
}
filter = "";
//desearch searchfile = new desearch(search);
count = 0;
filecount = 0;
strinfo = new StringBuilder();
if (chvb.Checked)//选择了VB
{
filter += "*.vb,";
//IAsyncResult ir=searchfile.BeginInvoke("*.vb", null, null);
//while (!ir.IsCompleted)//异步执行
//{
// Application.DoEvents();
//}
//searchfile.EndInvoke(ir);
search("*.vb");
}
if (chCSharp.Checked)//选择了C#
{
filter += "*.cs,";
//IAsyncResult ir = searchfile.BeginInvoke("*.cs", null, null);
//while (!ir.IsCompleted)//异步执行
//{
// Application.DoEvents();
//}
//searchfile.EndInvoke(ir);
search("*.cs");
}
if (filter.Trim() == "")
{
MessageBox.Show("请选择要统计的语言种类");
btnser.Enabled = !btnser.Enabled;
return;
}
strinfo.AppendLine("主目录:" + curDir);
strinfo.AppendLine("所选择的文件类型有:" + filter.Substring(0, filter.Length - 1));
strinfo.AppendLine("发现文件个数为:" + filecount);
strinfo.AppendLine("代码总行数为:" + count);
txtinfo.Text = strinfo.ToString();
}
catch
{
MessageBox.Show("未知错误,请确保路径正确和其子目录可读!", "", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
}
btnser.Enabled = !btnser.Enabled;

}
private void search(string ftype)
{
string[] files;
if (chChirld.Checked)
{
files = Directory.GetFiles(curDir, ftype, SearchOption.AllDirectories);//遍历所有子目录
}
else
{
files = Directory.GetFiles(curDir, ftype, SearchOption.TopDirectoryOnly);
}
StreamWriter sw =null;
if (wrfile != "")
{
try
{
if (!File.Exists(wrfile))
{
FileStream f = File.Create(wrfile);
f.Close();
}
sw = new StreamWriter(wrfile,false,Encoding.GetEncoding("gb2312"));
}
catch
{
sw = null;
}
}
foreach (string file in files)
{
if (file.EndsWith(ftype.Replace("*", "Designer"))) continue;//资源文件
filecount ++;
StreamReader sr = new StreamReader(file,Encoding.GetEncoding("gb2312"));
lbSearchFile.Text = "当前统计文件:" + Path.GetFileName(file);
Application.DoEvents();
string line;//当前读取的行
while (!sr.EndOfStream)
{
line = sr.ReadLine().Trim();
if (sw!=null&&line != "") sw.WriteLine(line);
if (!checktype(line))
{
continue;//如果不是有效代码
}
count++;
}
sr.Close();
}
if (sw != null) {sw.Close();}
//sw.Close();
lbSearchFile.Text = "";
}
/// <summary>
/// 判断是否为有效代码行
/// </summary>
/// <param name="strline">代码行</param>
/// <returns></returns>
private bool checktype(string strline)
{
bool isok = true;
//C#代码判断
if (!ischeck && strline.StartsWith("/*") && strline.IndexOf("*/")<0)
{
isok = false;
ischeck = true;//为连续注释
}
else
{
if (ischeck&&strline.IndexOf("*/") >= 0)
{
ischeck = false;
}
}

if (ischeck||strline.StartsWith("//") || (strline.IndexOf("/*") <= 0 && strline.EndsWith("*/")) || strline == "{" || strline == "}")
{
isok = false;
}
else
if (strline.StartsWith("'")||strline=="")//vb.net代码
isok = false;
return isok;
}
private void 统计FToolStripMenuItem_Click(object sender, EventArgs e)
{
if(btnser.Enabled) btnser_Click(sender, e);
}

private void 设置目录CToolStripMenuItem_Click(object sender, EventArgs e)
{
btnDir_Click(sender,e);
}

private void 退出EToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void btnser_EnabledChanged(object sender, EventArgs e)
{
统计FToolStripMenuItem.Enabled = btnser.Enabled;
}
//选择保存路径
private void btnwr_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.AddExtension = true;
//sfd.CheckFileExists = true;
sfd.DefaultExt = "*.doc";
sfd.Filter = "Word File|*.doc;*.wps|TXT FILE|*.txt";
sfd.ShowDialog();
if (sfd.FileName.Trim() != "") { wrfile = sfd.FileName; txtWrite.Text = wrfile; }
}

private void txtWrite_TextChanged(object sender, EventArgs e)
{
wrfile = txtWrite.Text;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: