| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | <?php/** * Filesystem tools not provided by default; can recursively create, copy * and delete folders. Some template methods are provided for extensibility. * * @note This class must be instantiated to be used, although it does *       not maintain state. */class FSTools{    private static $singleton;    /**     * Returns a global instance of FSTools     */    public static function singleton()    {        if (empty(FSTools::$singleton)) FSTools::$singleton = new FSTools();        return FSTools::$singleton;    }    /**     * Sets our global singleton to something else; useful for overloading     * functions.     */    public static function setSingleton($singleton)    {        FSTools::$singleton = $singleton;    }    /**     * Recursively creates a directory     * @param string $folder Name of folder to create     * @note Adapted from the PHP manual comment 76612     */    public function mkdirr($folder)    {        $folders = preg_split("#[\\\\/]#", $folder);        $base = '';        for($i = 0, $c = count($folders); $i < $c; $i++) {            if(empty($folders[$i])) {                if (!$i) {                    // special case for root level                    $base .= DIRECTORY_SEPARATOR;                }                continue;            }            $base .= $folders[$i];            if(!is_dir($base)){                $this->mkdir($base);            }            $base .= DIRECTORY_SEPARATOR;        }    }    /**     * Copy a file, or recursively copy a folder and its contents; modified     * so that copied files, if PHP, have includes removed     * @note Adapted from http://aidanlister.com/repos/v/function.copyr.php     */    public function copyr($source, $dest)    {        // Simple copy for a file        if (is_file($source)) {            return $this->copy($source, $dest);        }        // Make destination directory        if (!is_dir($dest)) {            $this->mkdir($dest);        }        // Loop through the folder        $dir = $this->dir($source);        while ( false !== ($entry = $dir->read()) ) {            // Skip pointers            if ($entry == '.' || $entry == '..') {                continue;            }            if (!$this->copyable($entry)) {                continue;            }            // Deep copy directories            if ($dest !== "$source/$entry") {                $this->copyr("$source/$entry", "$dest/$entry");            }        }        // Clean up        $dir->close();        return true;    }    /**     * Overloadable function that tests a filename for copyability. By     * default, everything should be copied; you can restrict things to     * ignore hidden files, unreadable files, etc. This function     * applies to copyr().     */    public function copyable($file)    {        return true;    }    /**     * Delete a file, or a folder and its contents     * @note Adapted from http://aidanlister.com/repos/v/function.rmdirr.php     */    public function rmdirr($dirname)    {        // Sanity check        if (!$this->file_exists($dirname)) {            return false;        }        // Simple delete for a file        if ($this->is_file($dirname) || $this->is_link($dirname)) {            return $this->unlink($dirname);        }        // Loop through the folder        $dir = $this->dir($dirname);        while (false !== $entry = $dir->read()) {            // Skip pointers            if ($entry == '.' || $entry == '..') {                continue;            }            // Recurse            $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);        }        // Clean up        $dir->close();        return $this->rmdir($dirname);    }    /**     * Recursively globs a directory.     */    public function globr($dir, $pattern, $flags = NULL)    {        $files = $this->glob("$dir/$pattern", $flags);        if ($files === false) $files = array();        $sub_dirs = $this->glob("$dir/*", GLOB_ONLYDIR);        if ($sub_dirs === false) $sub_dirs = array();        foreach ($sub_dirs as $sub_dir) {            $sub_files = $this->globr($sub_dir, $pattern, $flags);            $files = array_merge($files, $sub_files);        }        return $files;    }    /**     * Allows for PHP functions to be called and be stubbed.     * @warning This function will not work for functions that need     *      to pass references; manually define a stub function for those.     */    public function __call($name, $args)    {        return call_user_func_array($name, $args);    }}// vim: et sw=4 sts=4
 |