需要 PHP 脚本来解压并循环遍历压缩文件

发布于 2024-08-28 02:56:55 字数 401 浏览 10 评论 0原文

我正在使用一个相当简单的脚本来打开和解析几个 gzip 压缩的 xml 文件。我还需要对 ZIP 文件执行相同的基本操作。看起来应该很简单,但我无法在任何地方找到看起来等效的代码。

这是我已经在做的事情的简单版本:

$import_file = "source.gz";

$sfp = gzopen($import_file, "rb");  /////  OPEN GZIPPED data
while ($string = gzread($sfp, 4096)) {    //Loop through the data

    /// Parse Output And Do Stuff with $string
}
gzclose($sfp);      

对于压缩文件,什么会做同样的事情?

I am using a fairly straight-forward script to open and parse several xml files that are gzipped. I also need to do the same basic operation with a ZIP file. It seems like it should be simple, but I haven't been able to find what looked like equivalent code anywhere.

Here is the simple version of what I am already doing:

$import_file = "source.gz";

$sfp = gzopen($import_file, "rb");  /////  OPEN GZIPPED data
while ($string = gzread($sfp, 4096)) {    //Loop through the data

    /// Parse Output And Do Stuff with $string
}
gzclose($sfp);      

What would do the same thing for a zipped file?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

﹏半生如梦愿梦如真 2024-09-04 02:56:55

如果您的 PHP 5 >= 5.2.0、PECL zip >= 1.5.0 那么您可以使用 ZipArchive 库:

$zip = new ZipArchive; 
if ($zip->open('source.zip') === TRUE) 
{ 
     for($i = 0; $i < $zip->numFiles; $i++) 
     {   
        $fp = $zip->getStream($zip->getNameIndex($i));
        if(!$fp) exit("failed\n");
        while (!feof($fp)) {
            $contents = fread($fp, 8192);
            // do some stuff
        }
        fclose($fp);
     }
} 
else 
{ 
     echo 'Error reading zip-archive!'; 
} 

If you have PHP 5 >= 5.2.0, PECL zip >= 1.5.0 then you may use the ZipArchive libraries:

$zip = new ZipArchive; 
if ($zip->open('source.zip') === TRUE) 
{ 
     for($i = 0; $i < $zip->numFiles; $i++) 
     {   
        $fp = $zip->getStream($zip->getNameIndex($i));
        if(!$fp) exit("failed\n");
        while (!feof($fp)) {
            $contents = fread($fp, 8192);
            // do some stuff
        }
        fclose($fp);
     }
} 
else 
{ 
     echo 'Error reading zip-archive!'; 
} 
最近可好 2024-09-04 02:56:55

有一种聪明的方法可以使用 ZipArchive 来完成此操作。您可以使用带有 ZipArchive::statIndex()for 循环来获取所需的所有信息。您可以通过索引 (ZipArchive::getFromIndex()) 或名称 (ZipArchive::getFromName()) 访问文件。

例如:

function processZip(string $zipFile): bool
{
    $zip = new ZipArchive();
    if ($zip->open($zipFile) !== true) {
        echo '<p>Can\'t open zip archive!</p>';
        return false;
    }

    // As long as statIndex() does not return false keep iterating
    for ($idx = 0; $zipFile = $zip->statIndex($idx); $idx++) {
        $directory = \dirname($zipFile['name']);

        if (!\is_dir($zipFile['name'])) {
            // file contents
            $contents = $zip->getFromIndex($idx);
        }
    }
    $zip->close();
}

There is a smart way to do it with ZipArchive. You can use a for loop with ZipArchive::statIndex() to get all the information you need. You can access the files by their index (ZipArchive::getFromIndex()) or name (ZipArchive::getFromName()).

For example:

function processZip(string $zipFile): bool
{
    $zip = new ZipArchive();
    if ($zip->open($zipFile) !== true) {
        echo '<p>Can\'t open zip archive!</p>';
        return false;
    }

    // As long as statIndex() does not return false keep iterating
    for ($idx = 0; $zipFile = $zip->statIndex($idx); $idx++) {
        $directory = \dirname($zipFile['name']);

        if (!\is_dir($zipFile['name'])) {
            // file contents
            $contents = $zip->getFromIndex($idx);
        }
    }
    $zip->close();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文