Мне нужно скопировать только выбранные файлы и папки в PHP - PullRequest
1 голос
/ 20 мая 2010

Я использую следующий код в WINDOWS OS и PHP-скрипте, в котором сначала я использую разницу в структуре двух папок, а затем выходной файл должен быть скопирован в другую папку. вот код ниже ..

$source = '/var/www/html/copy1';
$mirror = '/var/www/html/copy2';
function scan_dir_recursive($dir, $rel = null) {

  $all_paths = array();
  $new_paths = scandir($dir);

  foreach ($new_paths as $path) {

    if ($path == '.' || $path == '..') {
      continue;
    }

    if ($rel === null) {
        $path_with_rel = $path;
    } else {
        $path_with_rel = $rel . DIRECTORY_SEPARATOR . $path;
    }

    $full_path = $dir . DIRECTORY_SEPARATOR . $path;
    $all_paths[] = $path_with_rel;

    if (is_dir($full_path)) {
      $all_paths = array_merge(
        $all_paths, scan_dir_recursive($full_path, $path_with_rel)
      );
    }

  }

  return $all_paths;

}
$diff_paths = array_diff(
    scan_dir_recursive($mirror),
    scan_dir_recursive($source)
);


/*$diff_path = array_diff($mirror,$original);*/
echo "<pre>Difference ";print_r($diff_paths);
    Difference of Folders Array
(
    [4] => New Folder (2)
    [5] => New Folder (2)/New Folder
    [6] => New Folder (2)/New Folder/New Folder
    [7] => New Folder (2)/New Folder/New Folder/New Text Document (2).txt
    [8] => New Folder (2)/New Folder/New Folder/New Text Document.txt
)

foreach($diff_paths as $path)
{
    echo $source1 = "var/www/html/copy2/".$path;
    echo "<br>";
    $des = "var/www/html/copy1/".$path;
    copy_recursive_dirs($source1, $des);
}

function copy_recursive_dirs($dirsource, $dirdest)
{ 
   $dir_handle=opendir($dirsource);

    mkdir($dirdest,0777);

 while(false!==($file=readdir($dir_handle)))
 {/*echo "<pre>";
  print_r($file);*/
     if($file!="." && $file!="..")
     {
         if(is_dir($dirsource.DIRECTORY_SEPARATOR.$file)) 
         {
            //Copy the file at the same level in the destination folder
            copy_recursive_dirs($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
         else{
            //Copy the dir at the same lavel in the destination folder
             copy ($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
     }
  }
 closedir($dir_handle);
 return true;
}

Всякий раз, когда я выполняю сценарий, я получаю вывод разницы, но не получаю другую копию во второй папке согласно коду ... Просьба помочь мне в исправлении ...

UPDATE Я просто хочу скопировать разницу в другая папка, если есть какая-либо другая Кстати, помогите мне ....

UPDATE: Я получаю эти ошибки,

(!) Предупреждение: opendir (var / www / html / copy2 / New Folder (2)) [function.opendir]: не удалось open dir: нет такого файла или каталога в /var/www/html/pranav_test/syncss.php по линии 96

(!) Предупреждение: mkdir () [function.mkdir]: нет такого файла или каталог в /var/www/html/pranav_test/syncss.php по линии 99

(!) Предупреждение: readdir (): поставляется Аргумент не является действительным каталогом ресурс в /var/www/html/pranav_test/syncss.php по линии 104

(!) Предупреждение: closedir (): поставляется Аргумент не является действительным каталогом ресурс в /var/www/html/pranav_test/syncss.php по линии 122

1 Ответ

1 голос
/ 20 мая 2010

Не пытайтесь делать все сразу.
Разделите вашу задачу на более мелкие куски.
И переходите к следующему, только если у вас есть готовый тест и предыдущая часть.

Сначала научитесь находить разницу между двумя массивами:
Hardcode 2 немного отличается массивами в вашем скрипте и играет с array_diff() функцией

Далее научитесь читать файлы из каталога. Не рекурсивный, только один.
Получите массив имен файлов.
Проверьте это с print_r()

Теперь вы можете попробовать прочитать 2 каталога в массивах и сравнить их.
Если он все еще не работает, отладьте его : распечатайте содержимое массивов, сравните его с глазами. Обратитесь за помощью к SO для этой конкретной и определенной проблемы с прямыми и четкими входными данными. в итоге получим массив отличий, напечатанный на экране , чтобы убедиться, что он содержит фактические данные.

Ну, теперь вы можете перейти к части копирования. Та же техника.

И тогда вы можете перейти к рекурсивным каталогам. Та же техника - двойная проверка и тестирование на каждом этапе. Выведите как можно больше отладочной информации.

Включите отчеты об ошибках и убедитесь, что вы видите каждую возникшую ошибку (просто сделайте преднамеренную и посмотрите). каждая операция с файловой системой приводит к ошибке при сбое. Итак, вы увидите причину. И отладка операций файловой системы. Распечатайте изнутри условия, чтобы увидеть, было ли оно выполнено. Вывести содержимое переменной, возвращаемые функцией значения.

Когда-нибудь стало любопытно, что это за $dirsource.DIRECTORY_SEPARATOR.$file строка фактическое значение?

...