Recursive Copy of Directory

前端 未结 14 942
花落未央
花落未央 2020-12-08 15:14

On my old VPS I was using the following code to copy the files and directories within a directory to a new directory that was created after the user submitted their form.

相关标签:
14条回答
  • 2020-12-08 15:35
    function recurse_copy($source, $dest)
    {
        // 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);
        }
    
        // Loop through the folder
        $dir = dir($source);
        while (false !== $entry = $dir->read()) {
            // Skip pointers
            if ($entry == '.' || $entry == '..') {
                continue;
            }
    
            // Deep copy directories
            recurse_copy("$source/$entry", "$dest/$entry");
        }
    
        // Clean up
        $dir->close();
        return true;
    }
    
    0 讨论(0)
  • 2020-12-08 15:39

    hmm. as that's complicated ))

    function mkdir_recursive( $dir ){
      $prev = dirname($dir);
      if( ! file_exists($prev))
      {
        mkdir_recursive($prev);
      }
      if( ! file_exists($dir))
      {
         mkdir($dir);
      }
    }
    
    ...
    
    foreach( $files as $file){
      mkdir_recursive( dirname( $dir_d . $file));
      copy( $dir_s . $file, $dir_d . $file);
    }
    

    $file - somthing like that www/folder/ahah/file.txt

    0 讨论(0)
  • 2020-12-08 15:40

    There were some issues with the functions that I tested in the thread and here is a powerful function that covers everything. Highlights:

    1. No need to have an initial or intermediate source directories. All of the directories up to the source directory and to the copied directories will be handled.

    2. Ability to skip directory or files from an array. (optional) With the global $skip; skipping of files even under sub level directories are handled.

    3. Full recursive support, all the files and directories in multiple depth are supported.

    $from = "/path/to/source_dir";
    $to = "/path/to/destination_dir";
    $skip = array('some_file.php', 'somedir');
    
    copy_r($from, $to, $skip);
    
    function copy_r($from, $to, $skip=false) {
        global $skip;
        $dir = opendir($from);
        if (!file_exists($to)) {mkdir ($to, 0775, true);}
        while (false !== ($file = readdir($dir))) {
            if ($file == '.' OR $file == '..' OR in_array($file, $skip)) {continue;}
            
            if (is_dir($from . DIRECTORY_SEPARATOR . $file)) {
                copy_r($from . DIRECTORY_SEPARATOR . $file, $to . DIRECTORY_SEPARATOR . $file);
            }
            else {
                copy($from . DIRECTORY_SEPARATOR . $file, $to . DIRECTORY_SEPARATOR . $file);
            }
        }
        closedir($dir);
    }
    
    0 讨论(0)
  • 2020-12-08 15:43

    Here's what we use at our company:

    static public function copyr($source, $dest)
    {
        // recursive function to copy
        // all subdirectories and contents:
        if(is_dir($source)) {
            $dir_handle=opendir($source);
            $sourcefolder = basename($source);
            mkdir($dest."/".$sourcefolder);
            while($file=readdir($dir_handle)){
                if($file!="." && $file!=".."){
                    if(is_dir($source."/".$file)){
                        self::copyr($source."/".$file, $dest."/".$sourcefolder);
                    } else {
                        copy($source."/".$file, $dest."/".$file);
                    }
                }
            }
            closedir($dir_handle);
        } else {
            // can also handle simple copy commands
            copy($source, $dest);
        }
    }
    
    0 讨论(0)
  • 2020-12-08 15:43

    OzzyCheck's is elegant and original, but he forgot the initial mkdir($dest); See below. No copy command is ever provided with contents only. It must fulfill its entire role.

    $source = "dir/dir/dir";
    $dest= "dest/dir";
    
    mkdir($dest, 0755);
    foreach (
      $iterator = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
      RecursiveIteratorIterator::SELF_FIRST) as $item) {
      if ($item->isDir()) {
        mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
      } else {
        copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
      }
    }
    
    0 讨论(0)
  • 2020-12-08 15:43

    Here's a simple recursive function to copy entire directories

    source: http://php.net/manual/de/function.copy.php

    <?php 
    function recurse_copy($src,$dst) { 
        $dir = opendir($src); 
        @mkdir($dst); 
        while(false !== ( $file = readdir($dir)) ) { 
            if (( $file != '.' ) && ( $file != '..' )) { 
                if ( is_dir($src . '/' . $file) ) { 
                    recurse_copy($src . '/' . $file,$dst . '/' . $file); 
                } 
                else { 
                    copy($src . '/' . $file,$dst . '/' . $file); 
                } 
            } 
        } 
        closedir($dir); 
    } 
    ?>
    
    0 讨论(0)
提交回复
热议问题