2014-02-03 3 views
2
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(); 
    } 

Пожалуйста, не возражайте против потенциальных опечаток в именах переменных, я переписал их и комментарий на английском языке, чтобы сделать их более читаемыми. Если я запустил код как есть, он удалит файлы и каталоги, но не создаст архив. Я проверил проверки на возвращаемые значения и addEmptyDir, addFile, unlink и rmdir все работает нормально. Однако, кажется, что удаление файлов препятствует правильному закрытию архива, и, следовательно, файл не создается.Удаление файлов после их добавления в архив запрещает создание архива

Я обходил его, сдвинув unlink и rmdir звонков после$zip->close(), поэтому файлы будут удалены только после того, как архив создаются. Тем не менее, я заставляю меня иметь двойные петли, и из того, что я собрал, рассматривая вопросы, связанные с документацией и почтой, здесь не должно быть никаких проблем с отключением, как я. Кто-нибудь знает, по какой причине это может случиться?

ответ

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); 
} 
+0

Поэтому код показан/с учетом других вопросов, например [ссылка ] (http://stackoverflow.com/questions/4914750/how-to-zip-a-whole-folder-using-php) ошибочно, так как они отсоединяются перед закрытием? Я попробовал немного меньше, чем дюжину вопросов, прежде чем спрашивать, и все они вставляют свою цепочку * внутри * цикла, поэтому я решил, что моя проблема - это что-то еще. – David

+0

Да, кажется так .. Забавно, что ответ, который вы связали, получил 16+ :) – hek2mgl

Смежные вопросы