1

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です。関数renameは、ファイルが別のプロセスによって使用されていることを示しています。ファイルは作成されますが、0kbです。

4

1 に答える 1

2

OK、解決策を見つけました。フォルダからzipファイルにファイルを追加するときに、それが実際のファイルなのか、現在のフォルダまたは親フォルダへのリンクなのかを確認できませんでした。例:/。または/..ファイルを反復処理するときにこの簡単なチェックを追加すると、すべてが正常に機能します。

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

誰かがこれを使用することを願っています。

于 2012-09-05T09:30:01.293 に答える