所以,据我所知,压缩文件夹及其内容非常容易,因为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次?
我试图改变这样的道路和愚蠢的事情。但是,它不起作用。
由于
答案 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函数: