| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | <?php/* * This file is part of the File_Iterator package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. *//** * FilterIterator implementation that filters files based on prefix(es) and/or * suffix(es). Hidden files and files from hidden directories are also filtered. * * @since     Class available since Release 1.0.0 */class File_Iterator extends FilterIterator{    const PREFIX = 0;    const SUFFIX = 1;    /**     * @var array     */    protected $suffixes = array();    /**     * @var array     */    protected $prefixes = array();    /**     * @var array     */    protected $exclude = array();    /**     * @var string     */    protected $basepath;    /**     * @param Iterator $iterator     * @param array    $suffixes     * @param array    $prefixes     * @param array    $exclude     * @param string   $basepath     */    public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL)    {        $exclude = array_filter(array_map('realpath', $exclude));        if ($basepath !== NULL) {            $basepath = realpath($basepath);        }        if ($basepath === FALSE) {            $basepath = NULL;        } else {            foreach ($exclude as &$_exclude) {                $_exclude = str_replace($basepath, '', $_exclude);            }        }        $this->prefixes = $prefixes;        $this->suffixes = $suffixes;        $this->exclude  = $exclude;        $this->basepath = $basepath;        parent::__construct($iterator);    }    /**     * @return bool     */    public function accept()    {        $current  = $this->getInnerIterator()->current();        $filename = $current->getFilename();        $realpath = $current->getRealPath();        if ($this->basepath !== NULL) {            $realpath = str_replace($this->basepath, '', $realpath);        }        // Filter files in hidden directories.        if (preg_match('=/\.[^/]*/=', $realpath)) {            return FALSE;        }        return $this->acceptPath($realpath) &&               $this->acceptPrefix($filename) &&               $this->acceptSuffix($filename);    }    /**     * @param  string $path     * @return bool     * @since  Method available since Release 1.1.0     */    protected function acceptPath($path)    {        foreach ($this->exclude as $exclude) {            if (strpos($path, $exclude) === 0) {                return FALSE;            }        }        return TRUE;    }    /**     * @param  string $filename     * @return bool     * @since  Method available since Release 1.1.0     */    protected function acceptPrefix($filename)    {        return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);    }    /**     * @param  string $filename     * @return bool     * @since  Method available since Release 1.1.0     */    protected function acceptSuffix($filename)    {        return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);    }    /**     * @param  string $filename     * @param  array  $subString     * @param  int    $type     * @return bool     * @since  Method available since Release 1.1.0     */    protected function acceptSubString($filename, array $subStrings, $type)    {        if (empty($subStrings)) {            return TRUE;        }        $matched = FALSE;        foreach ($subStrings as $string) {            if (($type == self::PREFIX && strpos($filename, $string) === 0) ||                ($type == self::SUFFIX &&                 substr($filename, -1 * strlen($string)) == $string)) {                $matched = TRUE;                break;            }        }        return $matched;    }}
 |