递归副本集文件夹要忽略

时间:2020-03-11 15:40:03

标签: php recursion directory copy

我正在使用此功能将WordPress的某些部分复制到备份目录中,但是当我备份plugins目录时,程序进入无限循环,有没有办法设置在复制文件夹时忽略的文件夹?从呼出$ 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 个答案:

答案 0 :(得分:1)

只要您运行的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起可以使用。

此示例摘自RecursiveDirectoryIterator类的PHP文档。感谢太阳,六年前他做到了。

希望有帮助。 ;)

答案 1 :(得分:0)

只要您可以访问足够高的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);

}

相关问题