发信人: dalasthunder(Dallas)
整理人: dalasthunder(2002-07-25 06:13:08), 站内信件
|
<?
/****************************************************************
程序行数统计程序 count.php
本程序独立运行,不需要任何数据库支持、头文件
本程序已在 Apache for Linux,Apache for Windows, IIS下测试通过
建立于:2001年1月19日 by Dallas
最近更新 更新人员 内容
2001年2月20日 Dallas 加入文件说明
2001年2月22日 Dallas 加入统计文件行数、大小功能
2001年2月23日 Dallas 加入统计每行字符数的功能
加入选择目录进行统计的功能
自动根据操作系统选择部分参数,确保显示正确
2001年2月25日 Dallas 加入选择文件类型的功能
*****************************************************************/
//是否显示调试信息
$DEBUG_LOCAL = false;
//预先定义的文档类型
$FILE_TYPES = array (
array (
"dfm",
"c",
"cpp",
"h",
"hpp",
"pas",
"php",
"htm",
"HTML",
"js",
"css",
"sh",
"inc"
),
array (
"Delphi Form",
"C 语言源程序",
"C++ 源程序",
"C 语言头文件",
"C++ 头文件",
"Pascal 源程序",
"PHP 文件",
"HTML 文件",
"HTML 文件",
"Java Script 文件",
"层叠样式表文档",
"Shell Script 文件",
"Include 文件"
)
);
//需要排除,不参与统计的文件
$FILES_EXCLUDE = array (
"count.php" => true,
"info.php" => true
);
$FILES_TOTAL = 0; //文件总数
$LINES_TOTAL = 0; //文件总行数
$SIZE_TOTAL = 0; //文件总大小
//根据是否在 Windows 下运行确定几个参数
if( EregI( "win32", $SERVER_SOFTWARE ) or EregI( "iis", $SERVER_SOFTWARE ) ) {
$URL_SELF = $PATH_INFO;
$PATH_CURRENT = StripSlashes( DirName( $PATH_TRANSLATED ) );
$DIR_SEPARATOR = "\\";
} else {
$URL_SELF = $PHP_SELF;
$PATH_CURRENT = DirName( $SCRIPT_FILENAME );
$DIR_SEPARATOR = "/";
}
$DIR_SUB = false; //储存当前目录状态,是否在子目录中
$DIR_NAME = $PATH_CURRENT;
//本函数读取指定目录中的相关文件
//输入参数:要读取的目录名,如果省略则为当前目录
//返回参数:存有该目录文件名的数组
function GetFiles( $path = "." ) {
global $FILE_TYPE, $FILES_EXCLUDE, $DEBUG_LOCAL, $PATH_CURRENT, $DIR_NAME, $DIR_SUB, $DIR_SEPARATOR;
if( $path != "." ) {
$DIR_NAME = $PATH_CURRENT.$DIR_SEPARATOR.$path;
ChDir( $path ); //进入该目录
$DIR_SUB = true;
} else {
$DIR_SUB = false;
}
$handle = OpenDir( "." );
$i = 0;
while ( $file = readdir( $handle ) ) {
if( $DEBUG_LOCAL )
echo "原有文件 $file \n";
//不是普通文件的不统计,这样就过滤掉了连接,目录
if( !Is_File( $file ) )
continue;
if( $DEBUG_LOCAL )
echo "通过is_file的文件 $file \n";
//取出从文件名最后一个'.'开始以后的子串为文件类型,转为小写
$TYPE = StrToLower( SubStr( $file, StrRPos( $file, '.' ) + 1 ) );
//如果文件类型不在预定义的类型中,也不统计
if( Empty( $FILE_TYPE[ $TYPE ] ) )
continue;
if( $DEBUG_LOCAL )
echo "通过预定义类型的文件 $file \n";
//如果在排除的文件中,也不统计
if( $FILES_EXCLUDE[ $file ] )
continue;
$files[ $i++ ] = $file;
if( $DEBUG_LOCAL )
echo "通过排除的文件 $file \n";
}
CloseDir( $handle );
//如果有内容则排序,否则返回原目录
if( COUNT( $files ) > 0 ) {
Sort( $files );
} else {
if( $DIR_SUB )
ChDir( ".." );
}
return $files;
}
//本函数格式统计并输出文件的相关信息
//输入参数:存有文件名的数组
//返回参数:无
function ShowResults( $files, $display_method = "ALL" ) {
global $DIR_NAME, $FILE_TYPE, $PATH_CURRENT, $FILES_TOTAL, $SIZE_TOTAL, $LINES_TOTAL,$DIR_SUB;
if( $display_method != "TOTAL" ) {
echo "<P>
<TABLE CELLSPACING=1 WIDTH=600>
<CAPTION>目录 $DIR_NAME</CAPTION>
<TR>
<TH NOWRAP>序号</TH>
<TH NOWRAP>文件名</TH>
<TH NOWRAP>文件类型</TH>
<TH NOWRAP>文件大小</TH>
<TH NOWRAP>文件行数</TH>
<TH NOWRAP>每行字符</TH>
</TR>\n";
}
$size_subtotal = 0;
$lines_subtotal = 0;
for( $i = 0; $i < Count( $files ); $i++ ) {
$size = FileSize( $files[ $i ] );
$size_subtotal += $size;
$contents = File( $files[ $i ] );
$line = Count( $contents );
$lines_subtotal += $line;
//取出从文件名最后一个'.'开始以后的子串为文件类型,转为小写
$TYPE = StrToLower( SubStr( $files[ $i ], StrRPos( $files[ $i ], '.' ) + 1 ) );
if( $line != 0 )
$chars_per_line = Round( $size / $line );
else
$chars_per_line = 0;
if( $lines_subtotal != 0 )
$chars_per_line_sub = Round( $size_subtotal / $lines_subtotal );
else
$chars_per_line_sub = 0;
$sequence = $i + 1;
if( $display_method == "ALL" ) {
echo " <TR>
<TD ALIGN=CENTER>$sequence</TD>
<TD NOWRAP>$files[$i]</TD>
<TD NOWRAP>$FILE_TYPE[$TYPE]</TD>
<TD ALIGN=RIGHT>$size</TD>
<TD ALIGN=RIGHT>$line</TD>
<TD ALIGN=CENTER>$chars_per_line</TD>
</TR>\n";
}
}
if( $display_method != "TOTAL" ) {
echo " <TR>
<TD CLASS=RESULT ALIGN=CENTER>小计</TD>
<TD CLASS=RESULT ALIGN=CENTER>$i 个文件</TD>
<TD CLASS=RESULT> </TD>
<TD CLASS=RESULT ALIGN=RIGHT NOWRAP>$size_subtotal 字节</TD>
<TD CLASS=RESULT ALIGN=RIGHT>$lines_subtotal 行</TD>
<TD CLASS=RESULT ALIGN=CENTER NOWRAP>平均每行 $chars_per_line_sub 字符</TD>
</TR>
</TABLE>\n";
}
if($DIR_SUB)
ChDir( ".." );
$FILES_TOTAL += $i;
$SIZE_TOTAL += $size_subtotal;
$LINES_TOTAL += $lines_subtotal;
}
//本函数显示总的统计结果
function ShowTotal() {
global $FILES_TOTAL, $SIZE_TOTAL, $LINES_TOTAL;
if( $LINES_TOTAL != 0 )
$chars_per_line_total = Round( $SIZE_TOTAL / $LINES_TOTAL );
else
$chars_per_line_total = 0;
echo "<P>
<TABLE CELLSPACING=1 WIDTH=600>
<CAPTION>以上总计</CAPTION>
<TR>
<TH NOWRAP>文件总数</TH>
<TH NOWRAP>总大小</TH>
<TH NOWRAP>总行数</TH>
<TH NOWRAP>总平均每行字符数</TH>
</TR>
<TR>
<TD CLASS=RESULT ALIGN=CENTER>$FILES_TOTAL 个文件</TD>
<TD CLASS=RESULT ALIGN=CENTER>$SIZE_TOTAL 字节</TD>
<TD CLASS=RESULT ALIGN=CENTER>$LINES_TOTAL 行</TD>
<TD CLASS=RESULT ALIGN=CENTER>$chars_per_line_total 字符</TD>
</TR>
</TABLE>\n";
}
?>
<HTML>
<HEAD>
<TITLE>文件统计</TITLE>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="TEXT/HTML; CHARSET=GB2312">
<STYLE>
TH {
FONT-FAMILY: 楷体_GB2312;
BACKGROUND-COLOR: YELLOW;
FONT-SIZE: 16PX;
}
TD {
BACKGROUND-COLOR: #88FF88;
FONT-SIZE: 14PX;
}
TD.LEVEL1 {
BACKGROUND-COLOR: #FFFFFF;
FONT-SIZE: 14PX;
}
TD.RESULT {
BACKGROUND-COLOR: LIGHTBLUE;
FONT-SIZE: 14PX;
}
H2 {
FONT-FAMILY: 楷体_GB2312;
COLOR: BLUE;
FONT-SIZE: 24PX;
}
CAPTION {
COLOR: BLUE;
FONT-SIZE: 18PX;
}
A.F12 {
CURSOR: HAND;
COLOR: BLUE;
FONT-SIZE: 12PX;
}
</STYLE>
<SCRIPT LANGUAGE="JavaScript">
function ReverseFileTypes( this_form ) {
for ( var i = 0; i < this_form.elements.length; i++ ) {
var e = this_form.elements[ i ];
srcID = e.id.substr( 0, 2 );
if( srcID == "FT" ) {
if(e.checked)
e.checked = false;
else
e.checked = true;
}
}
}
function ReverseDirs( this_form ) {
for ( var i = 0; i < this_form.elements.length; i++ ) {
var e = this_form.elements[ i ];
srcID = e.id.substr( 0, 3 );
if( srcID == "DIR" ) {
if( e.checked )
e.checked = false;
else
e.checked = true;
}
}
}
function TotalClick( this_form ) {
if( this_form.TOTAL_ONLY.checked )
this_form.SUB_DIR_ONLY.checked = false;
}
function SubDirsClick( this_form ) {
if( this_form.SUB_DIR_ONLY.checked )
this_form.TOTAL_ONLY.checked = false;
}
function SubDirsTextClick( this_form ) {
if( this_form.SUB_DIR_ONLY.checked )
this_form.SUB_DIR_ONLY.checked = false;
else {
this_form.SUB_DIR_ONLY.checked = true;
this_form.TOTAL_ONLY.checked = false;
}
}
function TotalTextClick( this_form ) {
if( this_form.TOTAL_ONLY.checked )
this_form.TOTAL_ONLY.checked = false;
else {
this_form.TOTAL_ONLY.checked = true;
this_form.SUB_DIR_ONLY.checked = false;
}
}
</SCRIPT>
</HEAD>
<BODY BGCOLOR="#ffffff" TOPMARGIN="0" LEFTMARGIN="0" MARGINWIDTH="0" MARGINHEIGHT="0">
<CENTER>
<P>
<H2>文件统计</H2>
<?
$handle = OpenDir( "." );
$i = 0;
while ( $file = ReadDir( $handle ) ) {
if( $DEBUG_LOCAL )
echo "文件名: $file \n";
//如果不是目录则跳过
if( !Is_Dir( $file ) )
continue;
//不显示父目录
if( $file == ".." )
continue;
$dirs[ $i++ ] = $file;
if( $DEBUG_LOCAL )
echo "目录名: $file \n";
}
CloseDir( $handle );
echo "<P>
<FORM METHOD=POST ACTION='$URL_SELF' NAME=DIRFORM>
<TABLE CELLSPACING=1 WIDTH=100%>
<TR VALIGN=TOP>
<TD CLASS=LEVEL1 ALIGN=LEFT>\n";
echo "<!-- Begin File Types Table -->
<TABLE CELLSPACING=1 WIDTH=300 BGCOLOR=#DDDDDD>
<CAPTION NOWRAP>统计以下文件类型</CAPTION>
<TR>
<TD COLSPAN=4> <A ID='SWITCH_FILE_TYPE' CLASS='F12' onClick='ReverseFileTypes(DIRFORM)'>切换选择状态</TD>
</TR>
<TR>
<TH ALIGN=CENTER WIDTH=15%>序号</TH>
<TH ALIGN=CENTER WIDTH=15%>选择</TH>
<TH ALIGN=CENTER WIDTH=25%>文件后缀</TH>
<TH ALIGN=CENTER>文件类型</TH>
</TR>\n";
for( $i = 0; $i < Count( $FILE_TYPES[ 0 ] ); $i++ ) {
$sequence = $i + 1;
$check = "CHECKED";
//默认不统计 Delphi Form 的行数
if( $FILE_TYPES[ 0 ][ $i ] == "dfm" )
$check = "";
echo " <TR>
<TD ALIGN=CENTER>$sequence</TD>
<TD ALIGN=CENTER><INPUT ID='FT$i' NAME='FILE_TYPE_SELECTED[]' TYPE=CHECKBOX $check VALUE='".$FILE_TYPES[ 0 ][ $i ]."'></TD>
<TD ALIGN=CENTER>".StrToUpper( $FILE_TYPES[ 0 ][ $i ] )."</TD>
<TD NOWRAP> ".$FILE_TYPES[ 1 ][ $i ]."</TD>
</TR>\n";
}
echo " <TR>
<TD COLSPAN=4> <A ID='SWITCH_FILE_TYPE' CLASS='F12' onClick='ReverseFileTypes(DIRFORM)'>切换选择状态</TD>
</TR>
</TABLE>
<!-- End File Types Table -->\n";
echo " </TD>
<TD CLASS=LEVEL1> </TD>
<TD CLASS=LEVEL1>\n";
echo "<!-- Begin Directorys Table -->
<TABLE CELLSPACING=1 WIDTH=400 BGCOLOR=#DDDDDD>
<CAPTION>当前目录 $PATH_CURRENT</CAPTION>
<TR>
<TD COLSPAN=3> <A ID='SWITCH_DIR' CLASS='F12' onClick='ReverseDirs(DIRFORM)'>切换选择状态</TD>
</TR>
<TR>
<TH ALIGN=CENTER WIDTH=15%>序号</TH>
<TH ALIGN=CENTER WIDTH=15%>选择</TH>
<TH ALIGN=CENTER>子目录</TH>
</TR>\n";
for( $i = 0; $i < count( $dirs ); $i++ ) {
$sequence = $i + 1;
echo " <TR>
<TD ALIGN=CENTER>$sequence</TD>
<TD ALIGN=CENTER><INPUT ID=DIR$i NAME=DIR_SELECTED[] TYPE=CHECKBOX CHECKED VALUE='".$dirs[ $i ]."'></TD>
<TD NOWRAP ALIGN=LEFT> ".$dirs[ $i ]."</TD>
</TR>\n";
}
echo " <TR>
<TD COLSPAN=3> <A ID=SWITCH_DIR CLASS=F12 onClick='ReverseDirs(DIRFORM)'>切换选择状态</TD>
</TR>
<TR>
<TD COLSPAN=3>
<INPUT ID=SUB_DIR_ONLY NAME=SUB_DIR_ONLY TYPE=CHECKBOX VALUE=1 onClick='SubDirsClick(DIRFORM)'>
<A CLASS='F12' onClick='SubDirsTextClick(DIRFORM)'>仅显示统计结果
<INPUT ID=TOTAL_ONLY NAME=TOTAL_ONLY TYPE=CHECKBOX VALUE=1 CHECKED onClick='TotalClick(DIRFORM)'>
<A CLASS='F12' onClick='TotalTextClick(DIRFORM)'>仅显示总结果
</TD>
</TR>
</TABLE>
<!-- End Directorys Table -->\n";
echo " </TD>
<TD CLASS=LEVEL1 WIDTH=100%> </TD>
</TR>
</TABLE>
<CENTER>
<INPUT ID='COUNT' NAME='COUNT' TYPE=SUBMIT VALUE=' 统计 '>
</CENTER>
</FORM>\n\n";
if( $COUNT ) {
//根据文件类型原型数组生成一个索引数组
for( $i = 0; $i < Count( $FILE_TYPES[ 0 ] ); $i++ ) {
$FILE_TYPE_INDEX[ $FILE_TYPES[ 0 ][ $i ] ] = $FILE_TYPES[ 1 ][ $i ];
}
//根据选中的文件类型再生成文件类型索引数组
for( $i = 0; $i < Count( $FILE_TYPE_SELECTED ); $i++ ) {
$FILE_TYPE[ $FILE_TYPE_SELECTED[ $i ] ] = $FILE_TYPE_INDEX[ $FILE_TYPE_SELECTED[ $i ] ];
}
$display_method = "ALL";
if( $SUB_DIR_ONLY )
$display_method = "SUB";
if( $TOTAL_ONLY )
$display_method = "TOTAL";
for( $i=0; $i < Count( $DIR_SELECTED ); $i++ ) {
$files = GetFiles( $DIR_SELECTED[ $i ] );
if( Count( $files ) > 0 ) {
ShowResults( $files, $display_method );
}
}
ShowTotal();
}
echo "<P>
</BODY>
</HTML>";
?>
|
|