home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / File / Find.php next >
PHP Script  |  2001-01-10  |  6KB  |  227 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Sterling Hughes <sterling@php.net>                          |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: Find.php,v 1.11 2001/01/10 01:01:54 ssb Exp $
  20. //
  21. // Commonly needed functions searching directory trees
  22. //
  23.  
  24. require_once 'PEAR.php';
  25.  
  26. class File_Find
  27. {
  28.     var $_dirs       = array ();
  29.     var $files       = array ();
  30.     var $directories = array ();
  31.  
  32.     /**
  33.      * Search the current directory to find matches for the
  34.      * the specified pattern.
  35.      *
  36.      * @param $pattern a string containing the pattern to search
  37.      * the directory for.
  38.      * 
  39.      * @param $direct_path a string containing the directory path
  40.      * to search.
  41.      *
  42.      * @param $pattern_type a string containing the type of 
  43.      * pattern matching functions to use (can either be 'php' or
  44.      * 'perl').
  45.      *
  46.      * @return an array containing all of the files and directories
  47.      * matching the pattern.
  48.      * 
  49.      * @author Sterling Hughes <sterling@php.net>
  50.      */
  51.     function &glob ($pattern, $dirpath, $pattern_type='php')
  52.     {
  53.         $dh = @opendir ($dirpath);
  54.         
  55.         if (!$dh) {
  56.             $pe = new FileFindException ("Cannot open directory");
  57.             return ($pe);
  58.         }
  59.             
  60.         $match_function = File_Find::_determineRegex ($pattern_type);
  61.  
  62.         while ($entry = @readdir ($dh))
  63.         {
  64.             if ($match_function ($pattern, $entry) &&
  65.                 $entry != '.'                      &&
  66.                 $entry != '..') {
  67.                 $matches[] = $entry;
  68.             }
  69.         }
  70.         
  71.         @closedir ($dh);
  72.         return ($matches);
  73.     }
  74.  
  75.     /**
  76.      * Map the directory tree given by the directory_path parameter.
  77.      *
  78.      * @param $directory_path contains the directory path that you
  79.      * want to map.
  80.      *
  81.      * @return a two element array, the first element containing a list
  82.      * of all the directories, the second element containing a list of all the
  83.      * files.
  84.      *
  85.      * @author Sterling Hughes <sterling@php.net>
  86.      */
  87.     function &maptree ($directory)
  88.     {
  89.         $this->_dirs = array ($directory);
  90.  
  91.         while (count ($this->_dirs))
  92.         {
  93.             $dir = array_pop ($this->_dirs); 
  94.             File_Find::_build ($dir);
  95.             array_push ($this->directories, $dir);
  96.         }
  97.         
  98.         return array ($this->directories, $this->files);
  99.     }
  100.     
  101.     /**
  102.      * Search the specified directory tree with the specified pattern.  Return an
  103.      * array containing all matching files (no directories included).
  104.      *
  105.      * @param $pattern the pattern to match every file with.
  106.      * 
  107.      * @param $directory the directory tree to search in.
  108.      * 
  109.      * @param $regex_type the type of regular expression support to use, either
  110.      * 'php' or 'perl'.
  111.      *
  112.      * @return a list of files matching the pattern parameter in the the directory
  113.      * path specified by the directory parameter
  114.      *
  115.      * @author Sterling Hughes <sterling@php.net>
  116.      */
  117.     function &search ($pattern, $directory, $type='php') {
  118.         list (,$files)  = File_Find::maptree ($directory);
  119.         $match_function = File_Find::_determineRegex ($type);
  120.         
  121.         reset ($files);
  122.         while (list (,$entry) = each ($files))
  123.         {
  124.             if ($match_function ($pattern, $entry))
  125.                 $matches[] = $entry;
  126.         }
  127.         
  128.         return ($matches);
  129.     }
  130.     
  131.     /**
  132.      * Determine whether or not a variable is a PEAR exception
  133.      *
  134.      * @param $var the variable to test.
  135.      * 
  136.      * @return returns true if the variable is a PEAR error, otherwise
  137.      * it returns false.
  138.      */
  139.     function isError (&$var)
  140.     {
  141.         return PEAR::isError($var);
  142.     }
  143.     
  144.     /**
  145.      * Fetch the current File_Find version
  146.      *
  147.      * @return the current File_Find version.
  148.      */
  149.     function File_Find_version()
  150.     {
  151.          return (1.1);
  152.     }
  153.  
  154.     /* 
  155.      * internal function to build singular directory trees, used by
  156.      * File_Find::maptree()
  157.      */
  158.     function _build ($directory)
  159.     {
  160.         $dh = @opendir ($directory);
  161.         
  162.         if (!$dh) {
  163.             $pe = new FileFindException ("Cannot open directory");
  164.             return ($pe);
  165.         }
  166.  
  167.         while ($entry = @readdir ($dh))
  168.         {
  169.         
  170.             if ($entry != '.' &&
  171.                 $entry != '..') {
  172.                 
  173.                 $entry = "$directory/$entry";
  174.                 
  175.                 if (is_dir ($entry))
  176.                     array_push ($this->_dirs, $entry);
  177.                 else
  178.                     array_push ($this->files, $entry);
  179.         
  180.             }
  181.         
  182.         }
  183.         
  184.         @closedir ($dh);
  185.     }
  186.     
  187.     /*
  188.      * internal function to determine the type of regular expression to
  189.      * use, implemented by File_Find::glob() and File_Find::search()
  190.      */
  191.     function _determineRegex ($type)
  192.     {
  193.         if (strtolower ($pattern_type) == 'perl') {
  194.             $match_function = 'preg_match';
  195.         } else if (strtolower (substr ($pattern, -2)) == '/i') {
  196.             $match_function = 'eregi';
  197.         } else {
  198.             $match_function = 'ereg';
  199.         }
  200.         
  201.         return ($match_function);
  202.     }
  203.  
  204. //End Class
  205. }
  206.  
  207. class FileFindException extends PEAR_Error
  208. {
  209.     var $classname             = 'FileFindException';
  210.     var $error_message_prepend = 'Error in File_Find';
  211.     
  212.     function FileFindException ($message, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE)
  213.     {
  214.         $this->PEAR_Error ($message, $mode, $level);
  215.     }
  216. }
  217.  
  218.  
  219. /*
  220.  * Local variables:
  221.  * tab-width: 4
  222.  * c-basic-offset: 4
  223.  * End:
  224.  */
  225.  
  226. ?>
  227.