在PHP中,这意味着什么:警告:ZipArchive :: close():读错误:(...)中的文件描述符错误?

时间:2017-08-31 13:33:04

标签: php ziparchive

我有一个PHP脚本来制作带有2个函数的zip:

  1. dirToArray:获取数组中的所有文件/ empty_folders
  2. create_zip:调用dirToArray()并生成zipArchive
  3. 我收到了一个奇怪的警告,实际上是因为我的zip存档没有构建而产生了真正的错误。

    警告结果

      

    警告:ZipArchive :: close():读取错误:第x行路径/ to / file.php中的文件描述符错误

    有人可以解释一下是什么意思:“文件描述符不好”?

    这是代码:

    dirToArray

    /* to copy all file/folder names from a directory into an array*/
    function dirToArray($dir_path) {
        $result = array();
        $path = realpath($dir_path);
        $objects = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::SELF_FIRST);
        foreach($objects as $name => $object) {
            if( $object->getFilename() !== "." && $object->getFilename() !== "..") {
                $result[] = $object;
            }
        }
        return $result;
    }
    

    create_zip

    /* creates a compressed zip file */
    function create_zip($productPath = '', $dirName = '', $overwrite = false) {
        $fullProductPath = $productPath.$dirName;
        $a_filesFolders = dirToArray( $fullProductPath );
        var_dump($a_filesFolders);
        //if the zip file already exists and overwrite is false, return false
        $zip = new \ZipArchive();
        $zipProductPath =  $fullProductPath.'.zip';
        if($zip->open( $zipProductPath ) && !$overwrite){
            $GLOBALS["errors"][] = "The directory {$zipProductPath} already exists and cannot be removed.";
        }
    
        //if files were passed in...
        if(is_array($a_filesFolders) && count($a_filesFolders)){
            $opened = $zip->open( $zipProductPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE );
            if( $opened !== true ){
                $GLOBALS["errors"][] = "Impossible to open {$zipProductPath} to edit it.";
            }
    
            //cycle through each file
            foreach($a_filesFolders as $object) {
                //make sure the file exists
                $fileName = $object -> getFilename();
                $pathName = $object -> getPathname();
                if(file_exists($pathName)) {
                    $pos = strpos($zipProductPath , "/tmp/") + 5;
                    $fileDestination = substr($pathName, $pos);
                    echo $pathName.'<br/>';
                    echo $fileDestination.'<br/>';
                    $zip->addFile($pathName,$fileDestination);
                }
                else if(is_dir( $pathName )){
                    $pos = strpos($zipProductPath , "/tmp/") + 5;
                    $fileDestination = substr($pathName, $pos);
                    $zip->addEmptyDir($fileDestination);
                }else{
                    $GLOBALS["errors"][] = "the file ".$fileName." does not exist !";
                }
            }
    
            //close the zip -- done!
            $zip->close();
            //check to make sure the file exists
            return file_exists($zipProductPath);
        }else{
            return false;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我发现了问题...我对file_exists()函数感到困惑,该函数检测目录是否存在...所以脚本将文件夹添加为文件并制作了错误。

create_zip(已修补)

/* creates a compressed zip file */
function create_zip($productPath = '', $dirName = '', $overwrite = false) {
    $fullProductPath = $productPath.$dirName;
    $a_filesFolders = dirToArray( $fullProductPath );
    var_dump($a_filesFolders);
    //if the zip file already exists and overwrite is false, return false
    $zip = new \ZipArchive();
    $zipProductPath =  $fullProductPath.'.zip';

    if($zip->open( $zipProductPath ) && !$overwrite){
        $GLOBALS["errors"][] = "The directory {$zipProductPath} already exists and cannot be removed.";
        return false;
    }
    //if files were passed in...
    if(is_array($a_filesFolders) && count($a_filesFolders)){
         $opened = $zip->open( $zipProductPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE );
        if( $opened !== true ){
            $GLOBALS["errors"][] = "Impossible to open {$zipProductPath} to edit it.";
            return false;
        }else{
            //cycle through each file
            foreach($a_filesFolders as $object) {
                //make sure the file exists
                $fileName = $object -> getFilename();
                $pathName = $object -> getPathname();
                if(is_dir( $pathName )){ /*<-- I put on first position*/
                    $pos = strpos($zipProductPath , "/tmp/") + 5;
                    $fileDestination = substr($pathName, $pos);
                    $zip->addEmptyDir($fileDestination);
                }else if(file_exists($pathName)) {
                    $pos = strpos($zipProductPath , "/tmp/") + 5;
                    $fileDestination = substr($pathName, $pos);
                    $zip->addFile($pathName,$fileDestination);
                }
                else{
                    $GLOBALS["errors"][] = "the file ".$fileName." does not exist !";
                }
            }

            //close the zip -- done!
            $zip->close();
            //check to make sure the file exists
            return file_exists($zipProductPath);
        }
    }else{
        return false;
    }
}