You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');

额外优化建议

  1. 处理大小写不敏感场景
    如果你的服务器文件名大小写不敏感(比如Windows环境),但担心Linux环境的大小写问题,可以改成不区分大小写的匹配:
// 把排除列表和当前项都转成小写再比较
$lowercase_exclude = array_map('strtolower', $exclude_list);
if ($item === '.' || $item === '..' || in_array(strtolower($item), $lowercase_exclude)) {
    continue;
}
  1. 控制目录结构
    read_dir的第二个参数$preserve_dirs:
  • 设为true(默认):会保留原目录结构(比如system/helpers/下的文件会按原路径打包)
  • 设为false:会把目录里的所有文件直接放到zip的根目录,不保留子文件夹

根据你的需求调整这个参数即可。

  1. 清理临时文件
    如果生成zip后不需要保留内存中的数据,可以调用:
$this->zip->clear_data();

这样就能完美实现你想要的多目标排除效果啦!

内容的提问来源于stack exchange,提问作者Kritik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:22:27