Author: dr
Date: Wed Jan 16 14:44:56 2008
New Revision: 7160

Log:
- Implemented issue #8529: Added a by-reference argument to
  ezcBaseFile::findRecursive that returns statistsics (count and total size)
  of all files that are returned by this function.

Modified:
    trunk/Base/ChangeLog
    trunk/Base/src/file.php
    trunk/Base/tests/file_find_recursive_test.php

Modified: trunk/Base/ChangeLog
==============================================================================
--- trunk/Base/ChangeLog [iso-8859-1] (original)
+++ trunk/Base/ChangeLog [iso-8859-1] Wed Jan 16 14:44:56 2008
@@ -1,6 +1,9 @@
 1.5alpha1 - [RELEASEDATE]
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+- Implemented issue #8529: Added a by-reference argument to
+  ezcBaseFile::findRecursive that returns statistsics (count and total size)
+  of all files that are returned by this function.
 - Implemented issue #11506: Added the static method
   ezcBase::getInstallationPath().
 

Modified: trunk/Base/src/file.php
==============================================================================
--- trunk/Base/src/file.php [iso-8859-1] (original)
+++ trunk/Base/src/file.php [iso-8859-1] Wed Jan 16 14:44:56 2008
@@ -19,11 +19,13 @@
  * $confFiles = ezcBaseFile::findRecursive( "/etc", array( '@\.conf$@' ) );
  *
  * // lists all autoload files in the components source tree and excludes the
- * // ones in the autoload subdirectory.
+ * // ones in the autoload subdirectory. Statistics are returned in the $stats
+ * // variable which is passed by reference.
  * $files = ezcBaseFile::findRecursive(
  *     "/dat/dev/ezcomponents",
  *     array( '@src/.*_autoload.php$@' ),
- *     array( '@/autoload/@' )
+ *     array( '@/autoload/@' ),
+ *     $stats
  * );
  *
  * // lists all binaries in /bin except the ones starting with a "g"
@@ -44,10 +46,14 @@
      * $includeFilters to include only specific files, and $excludeFilters to
      * exclude certain files from being returned. The function will always go
      * into subdirectories even if the entry would not have passed the filters.
-     *
-     * @param string $sourceDir
-     * @param array(string) $includeFilters
-     * @param array(string) $excludeFilters
+     * If you pass an empty array to the $statistics argument, the function
+     * will in details about the number of files found into the 'count' array
+     * element, and the total filesize in the 'size' array element.
+     *
+     * @param string         $sourceDir
+     * @param array(string)  $includeFilters
+     * @param array(string)  $excludeFilters
+     * @param array()       &$statistics
      *
      * @throws ezcBaseFileNotFoundException if the $sourceDir directory is not
      *         a directory or does not exist.
@@ -55,7 +61,7 @@
      *         not be opened for reading.
      * @return array
      */
-    static public function findRecursive( $sourceDir, array $includeFilters = 
array(), array $excludeFilters = array() )
+    static public function findRecursive( $sourceDir, array $includeFilters = 
array(), array $excludeFilters = array(), &$statistics = null )
     {
         if ( !is_dir( $sourceDir ) )
         {
@@ -67,6 +73,13 @@
         {
             throw new ezcBaseFilePermissionException( $sourceDir, 
ezcBaseFileException::READ );
         }
+
+        // init statistics array
+        if ( !is_array( $statistics ) )
+        {
+            $statistics['size']  = 0;
+            $statistics['count'] = 0;
+        }
         
         while ( ( $entry = $d->read() ) !== false )
         {
@@ -75,14 +88,20 @@
                 continue;
             }
 
-            if ( is_dir( $sourceDir . DIRECTORY_SEPARATOR . $entry ) )
+            $fileInfo = @stat( $sourceDir . DIRECTORY_SEPARATOR . $entry );
+            if ( !$fileInfo )
+            {
+                $fileInfo = array( 'size' => 0, 'mode' => 0 );
+            }
+
+            if ( $fileInfo['mode'] & 0x4000 )
             {
                 // We need to ignore the Permission exceptions here as it can
                 // be normal that a directory can not be accessed. We only need
                 // the exception if the top directory could not be read.
                 try
                 {
-                    $subList = self::findRecursive( $sourceDir . 
DIRECTORY_SEPARATOR . $entry, $includeFilters, $excludeFilters );
+                    $subList = self::findRecursive( $sourceDir . 
DIRECTORY_SEPARATOR . $entry, $includeFilters, $excludeFilters, $statistics );
                     $elements = array_merge( $elements, $subList );
                 }
                 catch ( ezcBaseFilePermissionException $e )
@@ -117,6 +136,9 @@
                 if ( $ok )
                 {
                     $elements[] = $sourceDir . DIRECTORY_SEPARATOR . $entry;
+                    echo "{$entry} = {$fileInfo['size']}\n";
+                    $statistics['count']++;
+                    $statistics['size'] += $fileInfo['size'];
                 }
             }
         }

Modified: trunk/Base/tests/file_find_recursive_test.php
==============================================================================
--- trunk/Base/tests/file_find_recursive_test.php [iso-8859-1] (original)
+++ trunk/Base/tests/file_find_recursive_test.php [iso-8859-1] Wed Jan 16 
14:44:56 2008
@@ -33,7 +33,8 @@
             13 => 'File/tests/file_remove_recursive_test.php',
             14 => 'File/tests/suite.php',
         );
-        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array(), array( '@/docs/@', '@svn@', '@\.swp$@' ) ) );
+        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array(), array( '@/docs/@', '@svn@', '@\.swp$@' ), $stats ) );
+        self::assertEquals( array( 'size' => 130984, 'count' => 15 ), $stats );
     }
 
     public function testRecursive2()
@@ -55,7 +56,8 @@
             13 => './File/tests/file_remove_recursive_test.php',
             14 => './File/tests/suite.php',
         );
-        self::assertEquals( $expected, ezcBaseFile::findRecursive( ".", array( 
'@^\./File/@' ), array( '@/docs/@', '@\.svn@', '@\.swp$@' ) ) );
+        self::assertEquals( $expected, ezcBaseFile::findRecursive( ".", array( 
'@^\./File/@' ), array( '@/docs/@', '@\.svn@', '@\.swp$@' ), $stats ) );
+        self::assertEquals( array( 'size' => 130984, 'count' => 15 ), $stats );
     }
 
     public function testRecursive3()
@@ -65,7 +67,8 @@
             1 => 'File/design/file_operations.png',
             2 => 'File/design/md5.png',
         );
-        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array( '@\.png$@' ), array( '@\.svn@' ) ) );
+        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array( '@\.png$@' ), array( '@\.svn@' ), $stats ) );
+        self::assertEquals( array( 'size' => 17642, 'count' => 3 ), $stats );
     }
 
     public function testRecursive4()
@@ -78,7 +81,8 @@
             4 => 'File/design/md5.png',
             5 => 'File/design/requirements.txt',
         );
-        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array( '@/design/@' ), array( '@\.svn@' ) ) );
+        self::assertEquals( $expected, ezcBaseFile::findRecursive( "File", 
array( '@/design/@' ), array( '@\.svn@' ), $stats ) );
+        self::assertEquals( array( 'size' => 114282, 'count' => 6 ), $stats );
     }
 
     public function testRecursive5()


-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to