php zipArchive-> close()返回False

时间:2012-09-04 11:48:54

标签: php zip

我有一个创建zip文件的功能。

function zipDoc($docRoot,$archiveName,$testsFolder){
$filename = tempnam($testsFolder, "doc");
$cwd=getcwd();
chdir ($docRoot);


 if (is_writeable($docRoot)){
    echo $docRoot." is writeable";
  }
    $zip = new ZipArchive();
    if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
        exit("cannot open <$filename>\n");
    }
  echo "<br/>";
  if (is_writeable(dirname($filename))){
    echo dirname($filename)." is writeable";
  }
    $folders = array ("_rels","docProps","word");
    // initialize an iterator
    // pass it the directory to be processed
    foreach ($folders as $folder){
        $iterator = new RecursiveIteratorIterator(new    RecursiveDirectoryIterator($folder."/"));
        // iterate over the directory
        // add each file found to the archive
        foreach ($iterator as $key=>$value) {
      if (!is_readable($key)){
           echo  "File ".$key." not readeble";
      }
            $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
        }
    }
    $zip->addFile("[Content_Types].xml");

    // close and save archive
    echo "<br/>";
  if ($zip->close()){
  echo $filename." is Closed";
  }
  else{
  echo $filename." is not closed";
  }
    $newname=str_replace(".tmp",".docx",$filename);
    rename($filename,$newname);
    chdir($cwd);
    return $newname;
}

输出是两个文件夹都是可写的(我在文件系统上也检查过),并且zip文件没有关闭! 有什么建议,为什么不关闭? 编辑:close()方法调用后的文件状态为3670068,函数重命名表示该文件正由另一个进程使用。该文件已创建但具有0kb。

1 个答案:

答案 0 :(得分:2)

好的,我找到了一个解决方案: 将文件夹从文件夹添加到zip文件时,我错过了检查它是否是真实文件,或者只是指向当前或父文件夹的链接,例如:/。要么 /.. 在迭代文件时添加这个简单的检查后,一切正常。

if (substr($key,-1)=="."){
                continue;
            }

希望有人会使用它。