CodeIgniter Zip库多文件夹与文件排除失效问题求助
解决CodeIgniter Zip库多目标排除失效的问题
没问题,当然可以实现多文件夹和文件的排除!你的原代码思路是对的,但可能因为一些细节问题导致排除规则失效,我来帮你修复并优化这个逻辑:
问题分析
你原代码中使用array_diff排除根目录项的思路本身没问题,但可能遇到以下情况导致失效:
- 文件名/文件夹名的大小写不匹配(比如系统里是
System但你写的是system) - 遍历逻辑的可读性差,排查问题困难
read_dir的参数设置不符合你的目录结构需求
修复后的代码
下面是更可靠、易维护的实现方式,完美支持多文件夹和文件的排除:
$this->load->library('zip'); // 定义要排除的根目录项(文件夹和文件都可以放这里) $exclude_list = array('backups', 'system', 'config.php', 'database.php'); // 遍历项目根目录的所有内容 foreach (scandir(FCPATH) as $item) { // 跳过当前目录、上级目录,以及需要排除的项 if ($item === '.' || $item === '..' || in_array($item, $exclude_list)) { continue; } $full_path = FCPATH . $item; // 处理文件夹:保留原目录结构(第二个参数true是默认值,可省略) if (is_dir($full_path)) { $this->zip->read_dir($full_path, true); } // 处理单个文件 elseif (is_file($full_path)) { $this->zip->read_file($full_path, true); } } // 生成压缩包到指定目录 $this->zip->archive(FCPATH . 'backups/' . date('Y-m-d-His') . '.zip');
额外优化建议
- 处理大小写不敏感场景
如果你的服务器文件名大小写不敏感(比如Windows环境),但担心Linux环境的大小写问题,可以改成不区分大小写的匹配:
// 把排除列表和当前项都转成小写再比较 $lowercase_exclude = array_map('strtolower', $exclude_list); if ($item === '.' || $item === '..' || in_array(strtolower($item), $lowercase_exclude)) { continue; }
- 控制目录结构
read_dir的第二个参数$preserve_dirs:
- 设为
true(默认):会保留原目录结构(比如system/helpers/下的文件会按原路径打包) - 设为
false:会把目录里的所有文件直接放到zip的根目录,不保留子文件夹
根据你的需求调整这个参数即可。
- 清理临时文件
如果生成zip后不需要保留内存中的数据,可以调用:
$this->zip->clear_data();
这样就能完美实现你想要的多目标排除效果啦!
内容的提问来源于stack exchange,提问作者Kritik
相关产品推荐
相关产品推荐

