好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP统计目录下的文件总数及代码行数 - php类库

PHP统计目录下的文件总数及代码行数

<?php  /**    * @author xiaoxiao <x_824@sina测试数据> 2011-1-12    * @link http://xiaoyaoxia.cnblogs测试数据/    * @license    * 统计目录下的文件行数及总文件数··去除注释    */     $obj  =  new  caculatefiles();  //如果设置为false,这不会显示每个文件的信息,否则显示   $obj ->setshowflag(false);  //会跳过所有all开头的文件   $obj ->setfileskip( array ( 'all' ));   $obj ->run( "d:phpappphp_tests" );    //所有文件,(默认格式为.php)   $obj ->setfileskip( array ());  $obj ->run( "d:phpappphp" );    $obj ->setshowflag(true);  //跳过所有i和a开头的文件,(比如接口和抽象类开头)   $obj ->setfileskip( array ( 'i' ,  'a' ));  $obj ->run( "d:phpappphp" );      /**    * 执行目录中文件的统计(包括文件数及总行数    *     * 1、跳过文件的时候:    *    匹配的规则只是从文件名上着手,匹配的规则也仅限在开头。    * 2、跳过文件中的注释行:    *    匹配的规则只是从注释段落的头部匹配,如果出现// 及 *及 #及/*开头的行及空行会被跳过。所以类似/*这种多汗注释,每行的开头都必须加上*号,否则无法匹配到这种的注释。    * 3、目录过滤:    *    匹配的规则是从目录名的全名匹配    */   class  caculatefiles {    /**     * 统计的后缀     */     private   $ext  =  ".php" ;    /**     * 是否显示每个文件的统计数,开源代码phpfensi测试数据     */     private   $showeveryfile  = true;    /**     * 文件的的跳过规则     */     private   $fileskip  =  array ();    /**     * 统计的跳过行规则     */     private   $lineskip  =  array ( "*" ,  "/*" ,  "//" ,  "#" );   /**    * 统计跳过的目录规则    */    private   $dirskip  =  array ( "." ,  ".." ,  '.svn' );        public   function  __construct( $ext  =  '' ,  $dir  =  '' ,  $showeveryfile  = true,  $dirskip  =  array (),  $lineskip  =  array (),  $fileskip  =  array ()) {     $this ->setext( $ext );     $this ->setdirskip( $dirskip );     $this ->setfileskip( $fileskip );     $this ->setlineskip( $lineskip );     $this ->setshowflag( $showeveryfile );     $this ->run( $dir );   }        public   function  setext( $ext ) {    trim( $ext ) &&  $this ->ext =  strtolower (trim( $ext ));   }    public   function  setshowflag( $flag  = true) {     $this ->showeveryfile =  $flag ;   }    public   function  setdirskip( $dirskip ) {     $dirskip  &&  is_array ( $dirskip ) &&  $this ->dirskip =  $dirskip ;   }    public   function  setfileskip( $fileskip ) {     $this ->fileskip =  $fileskip ;   }    public   function  setlineskip( $lineskip ) {     $lineskip  &&  is_array ( $lineskip ) &&  $this ->lineskip =  array_merge ( $this ->lineskip,  $lineskip );   }    /**     * 执行统计     * @param string $dir 统计的目录     */     public   function  run( $dir  =  '' ) {     if  ( $dir  ==  '' )  return ;     if  (! is_dir ( $dir ))  exit ( 'path error!' );     $this ->dump( $dir ,  $this ->readdir( $dir ));   }          /**     * 显示统计结果     * @param string $dir 目录     * @param array $result 统计结果(包含总行数,有效函数,总文件数     */     private   function  dump( $dir ,  $result ) {     $totalline  =  $result [ 'totalline' ];     $linenum  =  $result [ 'linenum' ];     $filenum  =  $result [ 'filenum' ];     echo   "*************************************************************rn<br/>" ;     echo   $dir  .  ":rn<br/>" ;     echo   "totalline: "  .  $totalline  .  "rn<br/>" ;     echo   "totalline with no comment and empty: "  .  $linenum  .  "rn<br/>" ;     echo   'totalfiles:'  .  $filenum  .  "rn<br/>" ;   }      /**     * 读取目录     * @param string $dir 目录     */     private   function  readdir( $dir ) {     $num  =  array ( 'totalline'  => 0,  'linenum'  => 0,  'filenum'  => 0);     if  ( $dh  = opendir( $dir )) {      while  (( $file  = readdir( $dh )) !== false) {       if  ( $this ->skipdir( $file ))  continue ;       if  ( is_dir ( $dir  .  '/'  .  $file )) {        $result  =  $this ->readdir( $dir  .  '/'  .  $file );        $num [ 'totalline' ] +=  $result [ 'totalline' ];        $num [ 'linenum' ] +=  $result [ 'linenum' ];        $num [ 'filenum' ] +=  $result [ 'filenum' ];      }  else  {        if  ( $this ->skipfile( $file ))  continue ;       list( $num1 ,  $num2 ) =  $this ->readfiles( $dir  .  '/'  .  $file );        $num [ 'totalline' ] +=  $num1 ;        $num [ 'linenum' ] +=  $num2 ;        $num [ 'filenum' ]++;      }     }      closedir ( $dh );    }  else  {      echo   'open dir <'  .  $dir  .  '> error!'  .  "r" ;    }     return   $num ;   }      /**     * 读取文件     * @param string $file 文件     */     private   function  readfiles( $file ) {     $str  = file( $file );     $linenum  = 0;     foreach  ( $str   as   $value ) {      if  ( $this ->skipline(trim( $value )))  continue ;      $linenum ++;    }     $totalnum  =  count (file( $file ));     if  (! $this ->showeveryfile)  return   array ( $totalnum ,  $linenum );     echo   $file  .  "rn" ;     echo   'totalline in the file:'  .  $totalnum  .  "rn" ;     echo   'totalline with no comment and empty in the file:'  .  $linenum  .  "rn" ;     return   array ( $totalnum ,  $linenum );   }            /**     * 执行跳过的目录规则     * @param string $dir 目录名     */     private   function  skipdir( $dir ) {     if  (in_array( $dir ,  $this ->dirskip))  return  true;     return  false;   }          /**     * 执行跳过的文件规则     * @param string $file 文件名     */     private   function  skipfile( $file ) {     if  ( strtolower ( strrchr ( $file ,  '.' )) !=  $this ->ext)  return  true;     if  (! $this ->fileskip)  return  false;     foreach  ( $this ->fileskip  as   $skip ) {      if  ( strpos ( $file ,  $skip ) === 0)  return  true;    }     return  false;   }          /**     * 执行文件中行的跳过规则     * @param string $string 行内容     */     private   function  skipline( $string ) {     if  ( $string  ==  '' )  return  true;     foreach  ( $this ->lineskip  as   $tag ) {      if  ( strpos ( $string ,  $tag ) === 0)  return  true;    }     return  false;   }  }  ?> 

查看更多关于PHP统计目录下的文件总数及代码行数 - php类库的详细内容...

  阅读:45次