在压缩文件中压缩没有额外文件夹的文件夹

时间:2013-02-28 21:26:18

标签: php zip

所以,据我所知,压缩文件夹及其内容非常容易,因为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

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

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

由于

2 个答案:

答案 0 :(得分:1)

bool ZipArchive::addFile ( string $filename [, string $localname ] )

文件名 要添加的文件的路径。

的localName ZIP存档中的本地名称。

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

pathinfo doc here

以下示例可以解决您的问题:

// 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();

答案 1 :(得分: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