Скопируйте все файлы и папки из одного каталога в другой каталог PHP - PullRequest
3 голосов
/ 03 октября 2009

У меня есть каталог с именем "mysourcedir", в котором есть файлы и папки sonme. поэтому я хочу скопировать весь контент из этого каталога в какую-то другую «папку назначения» на сервере Linux, используя PHP.

function full_copy( $source, $target ) {
if ( is_dir( $source ) ) {
    @mkdir( $target );
    $d = dir( $source );
    while ( FALSE !== ( $entry = $d->read() ) ) {
        if ( $entry == '.' || $entry == '..' ) {
            continue;
        }
        $Entry = $source . '/' . $entry; 
        if ( is_dir( $Entry ) ) {
            $this->full_copy( $Entry, $target . '/' . $entry );
            continue;
        }
        copy( $Entry, $target . '/' . $entry );
    }

    $d->close();
}else {
    copy( $source, $target );
}
}

Я пытаюсь этот код, но он делает некоторые проблемы, он создает каталог "mysourcedir" в месте назначения. Я ожидаю просто скопировать все файлы и папки в месте назначения. Пожалуйста, предложите

Ответы [ 8 ]

1 голос
/ 01 июня 2013

Здравствуйте, разработчики php, это не вопрос, а ответ на вопрос о том, как копировать файлы из одной папки в другую. Я наткнулся через Интернет на то, что некоторые разработчики используют rename () вместо copy () для перемещения файлов из одного каталога в другой. Вот простой рабочий код. Проверено и работает как шарм.

<=========================== Волшебство ================= ===========>

<?php    
    $dir = "path/to/targetFiles/";
    $dirNew="path/to/newFilesFolder/";
    // Open a known directory, and proceed to read its contents
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
            //exclude unwanted 
            if ($file==".") continue;
            if ($file=="..")continue;
            //if ($file=="index.php") continue; for example if you have index.php in the folder

            if (copy("$dir/$file","$dirNew/$file"))
                {
                echo "Files Copyed Successfully";
                //echo "<img src=$dirNew/$file  />"; 
                //if files you are moving are images you can print it from 
                //new folder to be sure they are there 
                }
                else {echo "File Not Copy";}
            }
            closedir($dh);
        }
    }


    ?>
1 голос
/ 06 января 2012
<?php 
/** 
 * Copy a file, or recursively copy a folder and its contents 
 * 
 * @author      Aidan Lister <aidan@php.net> 
 * @version     1.0.1 
 * @param       string   $source    Source path 
 * @param       string   $dest      Destination path 
 * @return      bool     Returns TRUE on success, FALSE on failure 
 */ 
function copyr($source, $dest) 
{ 
    // Simple copy for a file 
    if (is_file($source)) {
        chmod($dest, 777);
        return copy($source, $dest); 
    } 

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

    chmod($dest, 777);

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

        // Deep copy directories 
        if ($dest !== "$source/$entry") { 
            copyr("$source/$entry", "$dest/$entry"); 
        } 
    } 

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

?>
1 голос
/ 03 октября 2009
class FolderCopy {


  public static function copyFolder($src, $dest) {

    $path = realpath($src);
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);

      /** SplFileInfo $object*/
    foreach($objects as $name => $object)
    {
      $startsAt = substr(dirname($name), strlen($src));
      self::mkDir($dest.$startsAt);
      if(is_writable($dest.$startsAt) and $object->isFile())
      {
          copy((string)$name, $dest.$startsAt.DIRECTORY_SEPARATOR.basename($name));
      }
    }
  }

  private static function mkDir($folder, $perm=0777) {
    if(!is_dir($folder)) {
      mkdir($folder, $perm);
    }
  }

}

FolderCopy :: copyFolder (dirname (dirname ( FILE )). "/ Images", dirname ( FILE ). "/ Test");

Это мое предложение.

0 голосов
/ 20 марта 2018

Я перепробовал все примеры, но никто не копирует подпапки и их данные. Наконец я получил ответ:

<?php

    $dir = "/var/www/html/json/";
    $dirNew = "/var/www/html/json1/";
    // Open a known directory, and proceed to read its contents
    recurse_copy($dir, $dirNew);
    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 голосов
/ 26 апреля 2016

для сервера Windows:

shell_exec('xcopy \\old\\folder \\new\\folder /s /e /y /i');

для Linux-сервера:

shell_exec('cp -R /old/folder /new/folder');
0 голосов
/ 10 декабря 2009

попробуйте запустить cp -a. Это заботится о сохранении времени модов и разрешений, и все такое. cp -al создаст ферму жестких ссылок.

0 голосов
/ 03 октября 2009

Я думаю, что $ d-> read () вернет также имя родителя, и поэтому вы создаете его снова в целевом каталоге.

0 голосов
/ 03 октября 2009

Вы, вероятно, просто хотите переместить эту строку вниз, например:

function full_copy( $source, $target ) {
if ( is_dir( $source ) ) {
        $d = dir( $source );
        while ( FALSE !== ( $entry = $d->read() ) ) {
                if ( $entry == '.' || $entry == '..' ) {
                        continue;
                }
                $Entry = $source . '/' . $entry; 
                if ( is_dir( $Entry ) ) {
                        @mkdir( $Entry );
                        $this->full_copy( $Entry, $target . '/' . $entry );
                        continue;
                }
                copy( $Entry, $target . '/' . $entry );
        }

        $d->close();
}else {
        copy( $source, $target );
}

Хотя лично я бы не использовал 2 переменные с одним и тем же именем только для выделения их. Проверьте комментарии пользователей на http://www.php.net/copy для других возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...