问题
我正在构建一个在线文件管理器,用于下载整个目录结构,我正在生成所有子目录和文件的 zip 文件(递归),因此我使用RecursiveDirectoryIterator
. 这一切都很好,但空目录不在生成的 zip 文件中,尽管 dir 处理正确。这是我目前正在使用的:
<?php
$dirlist = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
$filelist = new RecursiveIteratorIterator($dirlist, RecursiveIteratorIterator::SELF_FIRST);
$zip = new ZipArchive();
if ($zip->open($tmpName, ZipArchive::CREATE) !== TRUE) {
die();
}
foreach ($filelist as $key=>$value) {
$result = false;
if (is_dir($key)) {
$result = $zip->addEmptyDir($key);
//this message is correctly generated!
DeWorx_Logger::debug('added dir '.$key .'('.$this->clearRelativePath($key).')');
}
else {
$result = $zip->addFile($key, $key);
}
}
$zip->close();
如果我省略了,FilesystemIterator::SKIP_DOTS
我最终会在所有目录中都有一个.
文件。
结论
迭代器工作,addEmptyDir
调用被正确执行(结果也被检查!),使用各种 zip 工具创建一个 zip 文件,使用空目录作为意图。这是 phps 中的错误ZipArchive
(php.net lib 还是我遗漏了什么?我不想最终创建虚拟文件只是为了保持目录结构完整。