发信人: 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>";
 ?>
  | 
 
 
 |