当前位置: 首页 > 面试题库 >

如何[递归]在PHP中压缩目录?

苏弘盛
2023-03-14
问题内容

目录类似于:

home/
    file1.html
    file2.html
Another_Dir/
    file8.html
    Sub_Dir/
        file19.html

我正在使用与PHPMyAdmin使用的相同的PHPZip类。我不确定如何压缩目录而不是仅压缩文件。这是我到目前为止的内容:

$aFiles = $this->da->getDirTree($target);
/* $aFiles is something like, path => filetime
Array
(
    [home] => 
    [home/file1.html] => 1251280379
    [home/file2.html] => 1251280377
    etc...
)

*/
$zip = & new Zip();
foreach( $aFiles as $fileLocation => $time ){
    $file = $target . "/" . $fileLocation;
    if ( is_file($file) ){
        $buffer = file_get_contents($file);
        $zip->addFile($buffer, $fileLocation);
    }
}
THEN_SOME_PHP_CLASS::toDownloadData($zip); // this bit works ok

但是当我尝试解压缩相应的已下载的zip文件时,出现“不允许操作”

仅当我尝试在Mac上解压缩时,才出现此错误,当我通过命令行解压缩时,文件解压缩就可以了。我是否需要在下载时发送特定的内容类型,当前为“application / zip”


问题答案:

这是一个简单的函数,可以递归压缩任何文件或目录,只需要加载zip扩展名即可。

function Zip($source, $destination)
{
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            $file = realpath($file);

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            }
            else if (is_file($file) === true)
            {
                $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    return $zip->close();
}

这样称呼它:

Zip('/folder/to/compress/', './compressed.zip');


 类似资料:
  • 问题内容: 我怀疑这是否是加密,但是找不到更好的短语。 我需要像这样传递一个长查询字符串: 查询字符串不包含任何敏感信息,因此在这种情况下我并不真正担心安全性。只是…好,太长且太丑陋。是否有一个库函数可以让我将查询字符串编码/加密/压缩为类似于md5()的结果(类似于,总是32个字符串),但是可以解码/解密/解压缩? 问题答案: 基本前提是非常困难的。在URL中传输任何值意味着您只能使用ASCII

  • 我想压缩(收缩)项目大小。我想知道在build.xml中应该在哪里添加这个属性“compress=true”。你能为它提供一些示例代码吗?

  • 问题内容: 如何在Android中递归扫描目录并显示文件名?我正在尝试扫描,但是速度很慢(强制关闭或等待)。我正在使用对此问题单独回答中给出的类。 问题答案: 您几乎应该始终仅从非UI线程访问文件系统。否则,您可能会长时间阻塞UI线程并获得ANR。在运行FileWalker 的。 这是FileWalker的稍微优化的版本: 您可以从这样的后台线程调用它:

  • 问题内容: 任何人都可以向我展示在我一直在搜索的Java中压缩和解压缩tar.gzip文件的正确方法,但是我能找到的最多是zip或gzip(单独)。 问题答案: 我最喜欢的是plexus-archiver-请参阅GitHub上的资源。 另一个选项是Apache commons- compress- (请参阅mvnrepository)。 使用plexus-utils,用于取消存档的代码如下所示:

  • COMPRESSING AND ARCHIVING 黑客经常需要下载和安装新软件,以及发送和下载多个脚本和大文件。如果将这些文件压缩并合并到单个文件中,那么这些任务就更容易完成。如果您来自 Windows 世界,您可能会从.zip格式中认识到这个概念,该格式组合和压缩文件,使其更小,以便通过互联网或可移动媒体传输。在 Linux 中有很多方法可以做到这一点,在本章中我们将介绍一些最常用的工具。我们

  • 问题内容: 我有此功能返回: } 但是我想做的是搜索文件/文件夹并返回它的路径,我该怎么做?你有这样的功能,或者可以给我一些技巧吗? 问题答案: 尝试结合使用RecursiveIteratorIterator和RecursiveDirectoryIterator