Рекурсивная копия каталога - PullRequest
19 голосов
/ 18 апреля 2011

На моем старом VPS я использовал следующий код для копирования файлов и каталогов в каталоге в новый каталог, который был создан после того, как пользователь отправил свою форму.VPS создает только основной каталог, но не копирует в него файлы.Я не понимаю, что могло измениться между двумя VPS?

Ответы [ 14 ]

0 голосов
/ 27 ноября 2017

Были некоторые проблемы с функциями, которые я тестировал в потоке, и вот мощная функция, которая охватывает все. Основные характеристики:

  1. Нет необходимости иметь начальные или промежуточные исходные каталоги. Все каталоги, вплоть до исходного каталога и скопированных каталогов, будут обработаны.

  2. Возможность пропускать каталог или файлы из массива. (необязательно) При global $skip; обработка файлов даже в каталогах подуровня обрабатывается.

  3. Полная рекурсивная поддержка, поддерживаются все файлы и каталоги в нескольких глубинах.

$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 голосов
/ 01 декабря 2015

Почему бы просто не попросить ОС позаботиться об этом?

system("cp -r olddir newdir");

Готово.

0 голосов

гм.как это сложно))

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 - что-то в этом роде www/folder/ahah/file.txt

0 голосов
/ 18 апреля 2011

Полагаю, вам следует проверить пользователя (группу) права .Например, вы должны рассмотреть chmod , в зависимости от , как вы запускаете (su?) PHP.Вы также можете изменить конфигурацию php .

...