将文件添加到现有ZIP文件

时间:2017-08-28 19:37:33

标签: php

编辑:问题如下。如果您想像我所做的那样压缩目录/文件夹,请参阅:How to zip a whole folder using PHP

我有一个带有计时器的应用程序,可以自动从我的服务器下载ZIP文件。

但ZIP文件每天都在更改。

当有人使用该应用程序时,应用程序用户将获得" 550文件不可用"错误,因为ZIP文件已被删除并再次添加(因为应用程序计时器每900毫秒执行一次)。

因此,如何在不重新创建ZIP文件的情况下添加新数据,而不是删除ZIP文件并使用新数据再创建它?

目前我用这个:

$zip = new ZipArchive;
// Get real path for our folder
$rootPath = realpath('../files_to_be_in_zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('../zouch.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
}

// Zip archive will be created only after closing object
$zip->close();

此代码获取files_to_be_in_zip文件夹的内容并重新创建" zouch.zip"用它来存档。

是的,我知道新数据的完整路径......它是$recentlyCreatedFile

编辑:我在http://php.net/manual/en/ziparchive.addfile.php

上找到了此代码
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->addFile('/path/to/index.txt', 'newname.txt');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>

但我也想在现有的ZIP中创建一个目录。

任何帮助?

谢谢!

1 个答案:

答案 0 :(得分:3)

当您打开zip时,您指定要在第二个参数中新创建或覆盖它。删除第二个参数应该使您的脚本按原样运行。以下是您已经实施了所需修改的代码。

$zip = new ZipArchive;
// Get real path for our folder
$rootPath = realpath('../files_to_be_in_zip');

$zip->open('../zouch.zip');

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($rootPath),
  RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file){
  // Skip directories (they would be added automatically)
  if (!$file->isDir()){
    // Get real and relative path for current file
    $filePath = $file->getRealPath();
    $relativePath = substr($filePath, strlen($rootPath) + 1);

    // Add current file to archive
    $zip->addFile($filePath, $relativePath);
  }
}

// Zip archive will be created only after closing object
$zip->close();

但是,如果您的数据已经存在于ZIP文件中,但将来需要更换,那么您必须使用ZipArchive::OVERWRITE

$zip->open('../zouch.zip', ZipArchive::OVERWRITE);