将文件添加到存档后删除文件会阻止创建存档

Dav*_*vid 2 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

我通过将unlinkrmdir调用移到后来$zip->close()规避它,因此文件仅在创建存档后才会被删除。然而,这迫使我有两次循环,从我收集的文档和与 zip 相关的问题来看,像我一样取消链接不应该有任何问题。有谁知道这可能发生的原因是什么?

hek*_*mgl 5

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;
}
Run Code Online (Sandbox Code Playgroud)

稍后,取消链接文件:

...
foreach($to_be_unlinked as $file) {
    unlink($file);
}
Run Code Online (Sandbox Code Playgroud)