小玩意,不多说,想看的一看就会,
界面如下:
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;
}
}
}
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;
}
}
}