白小白··· 2020-10-30 11:23 采纳率: 52.6%
浏览 37

php 打包指定路径下的文件夹

使用ZipArchive进行文件打包,程序执行结束之后发现打包后的zip包多出几个父级目录 求大神指点
目的把decompression文件夹下的Data文件夹压缩到$filezip目录下
$file = "./upload/issue/decompression/Data";
部分代码:

                        $filezip = "./upload/issue/decompression/".$time.'/'.$_FILES['file']['name'];//定义压缩后的文件名
                         if(!is_dir(dirname($filezip))){//判断路径
                            mkdir(dirname($filezip), 0777, true);
                        }
                        if($zip->open($filezip, \ZipArchive::CREATE )=== TRUE){
                            $this->addFileToZip($file.'/', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
                            $zip->close(); //关闭处理的zip文件
                            if(file_exists($filezip)){

                            }
                        }else{
                            #echo "1";
                        }
    public function addFileToZip($path,$zip){
        $handler=opendir($path); //打开当前文件夹由$path指定。
            $sum = 0;
        while(($filename=readdir($handler))!==false){

            if($filename != "." && $filename != ".."){ //文件夹文件名字为'.'和‘..’,不要对他们进行操作
                if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                    $this->addFileToZip($path."/".$filename, $zip);
                }else{ //将文件加入zip对象
                    $zip->addFile($path."/".$filename);
                }
            }
        }
        @closedir($path);
    }

图片说明

  • 写回答

1条回答 默认 最新

  • Design JBY 2023-05-01 18:47
    关注

    在使用 ZipArchive 进行文件打包时,如果打包的文件路径中包含了父级目录,那么在进行打包时就需要注意使用相对路径。以下是一个简单的示例代码:

    $zip = new ZipArchive();
    $filename = "example.zip";
    if ($zip->open($filename, ZipArchive::CREATE) !== true) {
        exit("无法创建ZipArchive对象或打开文件");
    }
    
    $dir = "/path/to/directory/"; // 需要打包的文件目录路径
    
    // 将目录内的所有文件添加到zip压缩包中,相对路径应该去掉目录的父级路径
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $filePath = str_replace($dir, "", str_replace("\\", "/", $file->getPathname()));
            $zip->addFile($file->getPathname(), $filePath);
        }
    }
    
    $zip->close();
    

    在以上示例代码中,使用了 RecursiveIteratorIteratorRecursiveDirectoryIterator 来遍历目录结构,然后调用 ZipArchive 实例对象的 addFile 方法将文件添加到压缩包中,这里需要注意,添加到压缩包中的文件路径应该是去掉了目录的父级路径。

    如果程序执行结束之后打包后的zip包多出几个父级目录,那么很可能是在添加文件时路径设置不正确或者打包前目录结构设置不正确导致的。所以需要仔细检查目录路径和添加文件的路径对应关系,并确保目录结构正确。

    评论

报告相同问题?

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: