将文件添加到存档后删除文件可防止存档的创建

时间:2014-02-03 13:02:35

标签: php zip unlink

    if ($zip->open($zipFile, ZipArchive::CREATE) !== TRUE) {
        (...)
    } else {
        $zip->addFile($tempDir.$fileName.".xls", $fileName.".xls");
        // The array contains the directory structure of the files to add
        foreach ($list_attachments as $dir_name => $attachment_files) {
            if (!empty($attachment_files)) {
                $zip->addEmptyDir($dir_name);
                foreach ($attachment_files as $attachment) {
                    $zip->addFile($tempDir.$dir_name."/".$attachment, $dir_name."/".$attachment));
                    unlink($tempDir.$dir_name."/".$attachment);
                }
                rmdir($tempDir.$dir_name."/");
            }
        }
        $zip->close();
    }

请不要介意变量名称中的潜在拼写错误,我重写了它们以及英语注释,以使它们更具可读性。 如果我按原样运行代码,它将删除文件和目录,但不会创建存档。我对返回值进行了检查,addEmptyDiraddFileunlinkrmdir都运行良好。但是,删除文件似乎会阻止存档正常关闭,因此不会创建文件。

我通过在unlink之后移动rmdir$zip->close()调用来规避它,因此只有在创建存档后才会删除文件。然而,迫使我有两次循环,从我收集的文件和拉链相关的问题,这里不应该像我一样解除链接的任何问题。 有谁知道这可能发生在哪个原因?

1 个答案:

答案 0 :(得分:2)

zip将在您调用$zip->close()后最终写入文件。在此之前,一切都在内存中发生,没有“压缩”。这就是为什么只有在成功调用$zip->close()之后才能删除解压缩的文件。

文档甚至说明如下:

  

当文件设置为添加到存档时,PHP将尝试锁定文件,并且仅在ZIP操作完成后才会释放。简而言之,这意味着您可以在存档关闭后首先删除添加的文件。

但是,锁定不会阻止您删除文件,它们只是“提示”,最大的问题是文件需要在close()进行处理。


所以内部循环应该如下所示:

foreach ($attachment_files as $attachment) {
    $zip->addFile($tempDir.$dir_name."/".$attachment, $dir_name."/".$attachment));
    $to_be_unlinked []= $tempDir.$dir_name."/".$attachment;
}

稍后,取消链接文件:

...
foreach($to_be_unlinked as $file) {
    unlink($file);
}