复制整个目录但排除一些文件php

时间:2015-06-15 02:12:20

标签: php

试图找到一种复制整个目录但排除某些文件的方法,在这种情况下只需要排除一个目录,该目录总是只包含1个文件png ... ...可能会使用与此代码类似的东西,但绝对没有关于如何仅排除文件的线索

function xcopy($source, $dest, $permissions = 0755)
{
    // Check for symlinks
    if (is_link($source)) {
        return symlink(readlink($source), $dest);
    }

    // Simple copy for a file
    if (is_file($source)) {
        return copy($source, $dest);
    }

    // Make destination directory
    if (!is_dir($dest)) {
        mkdir($dest, $permissions);
    }

    // Loop through the folder
    $dir = dir($source);
    while (false !== $entry = $dir->read()) {
        // Skip pointers
        if ($entry == '.' || $entry == '..') {
            continue;
        }

        // Deep copy directories
        xcopy("$source/$entry", "$dest/$entry", $permissions);
    }

    // Clean up
    $dir->close();
    return true;
}

1 个答案:

答案 0 :(得分:0)

这是一个可能适合您的功能。我注意到要澄清:

<?php
    function CopyDirectory($settings = false)
        {
            // The script may take some time if there are lots of files
            ini_set("max_execution_time",3000);
            // Just do some validation and pre-sets
            $directory  =   (isset($settings['dir']) && !empty($settings['dir']))? $settings['dir'] : false;
            $copyto     =   (isset($settings['dest']) && !empty($settings['dest']))? $settings['dest'] : false;
            $filter     =   (isset($settings['filter']) && !empty($settings['filter']))? $settings['filter'] : false;
            // Add the copy to destinations not to copy otherwise
            // you will have an infinite loop of files being copied
            $filter[]   =   $copyto;
            // Stop if the directory is not set
            if(!$directory)
                return;
            // Create a recursive directory iterator
            $dir        =   new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory),RecursiveIteratorIterator::CHILD_FIRST);

            try{ 
                foreach($dir as $file) {
                        $copydest   =   str_replace("//","/",$copyto."/".str_replace($_SERVER['DOCUMENT_ROOT'],"",$file));
                        $compare    =   rtrim($file,".");
                        if(is_dir($file)) {
                                if(!is_dir($copydest)) {
                                        if(!in_array($compare,$filter)) {
                                                if(isset($skip) && !preg_match("!".$skip."!",$file) || !isset($skip))
                                                    @mkdir($copydest,0755,true);
                                                else
                                                    $record[]   =   $copydest;
                                            }
                                        else {
                                                $skip       =   $compare;
                                            }
                                    }
                            }
                        elseif(is_file($file) && !in_array($file,$filter)) {
                                copy($file,$copydest);
                            }
                        else {
                                if($file != '.' && $file != '..')
                                    $record[]   =   $copydest;
                            }
                    }
                }
            // This will catch errors in copying (like permission errors)
            catch (Exception $e)
                {
                    $error[]    =   $e;
                }
        }

    // Copy from
    $settings['dir']        =   $_SERVER['DOCUMENT_ROOT'];
    // Copy to
    $settings['dest']       =   $_SERVER['DOCUMENT_ROOT']."/tester";
    // Files and folders to not include contents
    $settings["filter"][]   =   $_SERVER['DOCUMENT_ROOT'].'/core.processor/';
    $settings["filter"][]   =   $_SERVER['DOCUMENT_ROOT'].'/config.php';
    $settings["filter"][]   =   $_SERVER['DOCUMENT_ROOT'].'/client_assets/images/';

    // Create instance
    CopyDirectory($settings);
?>