我正在使用 ZipArchive 从包含我要保留的符号链接的目录构建存档。结构示例:
-- file1
-- file2
-- directory/file3 --> ../file1
当我执行下面的代码时,
directory/file3
出现在存档中,但它不是符号链接,而是具有file
的内容。虽然它有效,但我想保留大量链接以保持较小的存档大小。
$zip = new ZipArchive();
$zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE)
foreach($filesToZip as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getPathname();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
您会推荐什么解决方案?
我还尝试使用
file->getRealPath()
,这只会使问题变得更糟,因为它将文件及其绝对路径添加到存档中。
符号链接本质上是一个文本文件,其内容是目标路径,文件本身会有一个模式标志
l
。
原理很简单,但是涉及到的功能有点复杂:
if(is_link($filePath)) {
$targetPath = readlink($filePath);
$stat = lstat($filePath);
$zip->addFromString($relativePath, $targetPath);
$zip->setExternalAttributesName($relativePath,
ZipArchive::OPSYS_UNIX, $stat['mode'] << 16);
}