我正在处理一个项目,该项目要求我从服务器收集几个文件,对它们进行压缩,并使用js-dos将zip安装为驱动器。
一切正常。在测试过程中,我在windows中手动创建了一个zip文件,然后运行代码。在最后的测试中,我尝试安装php生成的zip,但在js-dos中执行DIR时,文件夹结构很奇怪。
我应该有一个文件夹,里面有几个文件。相反,有几个相同的文件夹,里面只有一个文件。
让我伤透脑筋的是,当我在winRAR中打开文件时,它是正确的,但在js-dos中,它突然不同了。
这是我的代码,它并不花哨:
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Skip directories (they would be added automatically)
if (!$fileZ->isDir())
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();
我猜窗户看起来不像多斯。用winRAR制作的zip文件还可以,但这个代码生成的文件很奇怪。
我想在php中生成.zip,而不是通过shell命令。有人能帮我弄清楚吗?
也许js-dos无法自动创建中间目录,您可以尝试下面的代码将中间目录添加到zip文件中。
$rootPath = realpath($filefoldername."/");
$zip = new ZipArchive();
$zip->open($filefoldername.'/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$filesZ = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath),
// !!!! replace LEAVES_ONLY with SELF_FIRST to include intermediate directories
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($filesZ as $nameZ => $fileZ)
{
// Get real and relative path for current file
$filePath = $fileZ->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$relativePath = str_replace('\', '/', $relativePath);
if ($fileZ->isDir()) {
$zip->addEmptyDir($relativePath);
} else {
$zip->addFile($filePath, $relativePath);
}
}
// Zip archive will be created only after closing object
$zip->close();