Папка набора рекурсивных копий, которую нужно игнорировать - PullRequest
0 голосов
/ 11 марта 2020

Я использую эту функцию для копирования частей WordPress в каталог резервных копий, однако, когда я создаю резервную копию каталога плагинов, программа вводит бесконечное значение l oop, есть ли способ настроить папку, игнорируемую при копировании папок ? при выводе $ dir я просто получаю #resource ID x

function sisb_content_dir_copy($src, $dst) {
$dir = opendir($src);
// Make the destination directory if not exist
@mkdir($dst);

// Loop through the files in source directory
while( $file = readdir($dir) ) {
  echo $file."</br>";
    if (( $file != '.' ) && ( $file != '..' )){
        if ( is_dir($src . '/' . $file) )
        {

            // Recursively calling custom copy function
            // for sub directory
            sisb_content_dir_copy($src . '/' . $file, $dst . '/' . $file);

        }
        else {
            copy($src . '/' . $file, $dst . '/' . $file);
        }
    }
}

closedir($dir);

}

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Поскольку вы используете PHP версию более 5.4, вы можете использовать встроенные классы PHP DirectoryIterator и FilterIterator для достижения вашей цели. С помощью класса Filter вы можете объявить, какие файлы и каталоги приняты итератором. Кроме того, встроенные классы итераторов работают быстрее и не мешают потреблению памяти. Вот небольшой пример.

<?php
$directory = new RecursiveDirectoryIterator($path, FilesystemIterator::FOLLOW_SYMLINKS);
$filter = new RecursiveCallbackFilterIterator($directory, function($current, $key, $iterator) {
    // Skip hidden files and directories.
    if ($current->getFilename()[0] === '.') {
        return FALSE;
    }

    if ($current->isDir()) {
        // Only recurse into intended subdirectories
        return $current->getFilename() === 'wanted_dirname';
    } else {
       // Only consume files of interest.
       return strpos($current->getFilename(), 'wanted_filename') === 0;
    }
});

$iterator = new RecursiveIteratorIterator($filter);
$files = [];

foreach ($iterator as $info) {
   $files[] = $info->getPathname();
}

Массив $files содержит все файлы, которые проходят фильтр обратного вызова. Эти файлы вы можете скопировать, куда захотите. Класс RecursiveCallbackFilterIterator является встроенным классом PHP, который можно использовать начиная с PHP 5.4 и далее.

Этот пример взят из документации PHP для RecursiveDirectoryIterator класс. Спасибо Солнцу, который сделал это шесть лет go.

Надеюсь, это поможет. ;)

0 голосов
/ 11 марта 2020

Принятый ответ лучше, если у вас есть доступ к достаточно высокой версии PHP, это работает для других версий, хотя

function sisb_content_dir_copy($src, $dst) {
//echo $src.'</br>';
$dir = opendir($src);
//echo '</br>'.$dst;
// Make the destination directory if not exist
//if (!file_exists('/srv/www/sisb/public_html/wp-content/plugins/WP-SISB/contentbackups')) {
@mkdir($dst);
//}
// Loop through the files in source directory
while( $file = readdir($dir) ) {
  echo $file."</br>";
    if (( $file != '.' ) && ( $file != '..' )){
        if ( is_dir($src . '/' . $file) && ($file !='unwanted folder'))
        {

            // Recursively calling custom copy function
            // for sub directory
            sisb_content_dir_copy($src . '/' . $file, $dst . '/' . $file);

        }
        else {
          if($file !='unwanted folder'){
            copy($src . '/' . $file, $dst . '/' . $file);
          }
        }
    }
}

closedir($dir);

}

...