【问题标题】:Recursive copy set folder to ignore要忽略的递归副本集文件夹
【发布时间】:2020-06-23 15:38:55
【问题描述】:

我正在使用此功能将部分 WordPress 复制到备份目录中,但是当我备份插件目录时程序进入无限循环,有没有办法在复制文件夹时设置要忽略的文件夹?从回显 $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);

}

【问题讨论】:

  • 所以这不是隐藏的,这是你的循环。因此,一旦您知道它是一个目录,如果它被称为“插件”(或其他),则跳过该目录的处理。还是我错过了你的问题?

标签: php recursion directory copy


【解决方案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 文档。感谢 sun,他在六年前就做到了。

希望对您有所帮助。 ;)

【讨论】:

  • 很好的解决方案,最终使用了另一种更容易兼容的方式,但我接受了这个答案,因为它是最好的解决方案
【解决方案2】:

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

}

【讨论】:

    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2019-03-19
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多