0

所以,我知道压缩文件夹及其内容非常容易,因为 php.net 和 stackoverflow 充满了示例代码。我也在尝试压缩一个文件夹。这是我的代码:

$zip = new ZipArchive;
$zip->open('myzip.zip', ZipArchive::CREATE);
foreach (glob("/Volumes/Data/Users/username/Desktop/Archive/some/thisFolder/*") as $file) {
    $zip->addFile($file);
}
$zip->close();

我的脚本在一个文件夹中运行,比如在桌面上,我想压缩thisFolder它的内容。上面的代码有效。但是,问题是当我解压缩myzip.zip创建的文件时,我得到了一个类似的结构

Volumes>Data>Users>username>Desktop>Archive>some>thisFolder

然后我thisFolder在这种情况下找到第 8 个文件夹 ( ) 中的内容。如何更改此代码,以便在解压缩时myzip.zip,我可以直接看到包含其中内容的文件夹thisFolder,而不必在获取我的内容之前浏览文件夹 7 次?

我试图改变路径和愚蠢的事情。但是,它不起作用。

谢谢

4

2 回答 2

1

如果您希望文件中的所有内容都是相对于您的起始文件夹的名称,请使用chdir()从那里开始:

chdir("/Volumes/Data/Users/username/Desktop/Archive/some/thisFolder");
foreach (glob("*") as $file) {
    $zip->addFile($file);
}

实际上,我认为当$file是子目录时这不会起作用——addFile不会自动递归。文档中有一条注释显示了如何编写递归 zip 函数:

http://www.php.net/manual/en/ziparchive.addemptydir.php

于 2013-02-28T21:49:41.683 回答
1
bool ZipArchive::addFile ( string $filename [, string $localname ] )

filename 要添加的文件的路径。

localname ZIP 存档中的本地名称。

您可以对pathinfo循环中的每个 $file 使用该函数,以便在没有路径的情况下检索文件名,然后将其用作 addFile 方法的第二个参数。

路径信息文档在这里

这是一个可以解决您的问题的示例:

// Create your zip archive
$zip = new ZipArchive;

// open it in creation mode
$zip->open('myzip.zip', ZipArchive::CREATE);

// Loop on all your file
$mask = "/Volumes/Data/Users/username/Desktop/Archive/some/thisFolder";
$allAvailableFiles = glob($mask . "/*")
foreach ($allAvailableFiles as $file)
{
    // Retrieve pathinfo
    $info = pathinfo($file);

    // Generate the internal directory
    $internalDir = str_replace($mask, "", $info['dirname']);

    // Add the file with internal directory
    $zip->addFile($file, $internalDir . "/" . $info['basename']);
}

$zip->close();
于 2013-02-28T21:34:58.987 回答