PHP PharData:从目录构建 .tar 存档,带有排除项
Posted
技术标签:
【中文标题】PHP PharData:从目录构建 .tar 存档,带有排除项【英文标题】:PHP PharData: build .tar archive from directory, with exclusions 【发布时间】:2021-07-31 02:44:59 【问题描述】:TLDR 版本:
如何利用PharData::buildFromIterator
从/path/to/project/
构建.tar 存档,但不包括文件列表,如/path/to/project/file0.txt
、/path/to/project/file1.txt
、/path/to/project/file2.txt
?
更长的版本,包括我尝试过的内容:
为了从 dir 路径构建 .tar 存档,我尝试使用简单的 PharData::buildFromDirectory
方法,该方法有第二个可选参数...有点...与我需要的完全相反
"pcre 正则表达式 [...] 只有匹配正则表达式的文件路径才会包含在存档中"
。所以我想,剩下的唯一选择就是使用PharData::buildFromIterator
,它有一个简单的用法示例:
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/project', FilesystemIterator::SKIP_DOTS)
),
'/path/to/project'
);
这个例子可能是一个起点,但从这里我不知道如何从迭代器中排除文件列表?
【问题讨论】:
【参考方案1】:如果有人觉得这个问题有用,我会发布一个答案,因为我已经弄清楚了如何去做,找到了类似问题的解决方案here,感谢用户 Levi Morrison。
(在 Windows 文件系统上测试正常,假设 __DIR__
是它运行的目录)
$exclude = ['file0.txt', 'file1.txt', 'file2.txt'];
/**
* @param SplFileInfo $file
* @param mixed $key
* @param RecursiveCallbackFilterIterator $iterator
* @return bool True if you need to recurse or if the item is acceptable
*/
$filter = function ($file, $key, $iterator) use ($exclude)
foreach($exclude as $excludefilename)
if(
strcmp(__DIR__ . DIRECTORY_SEPARATOR . $excludefilename, $file) === 0
) return false;
return true;
;
$innerIterator = new RecursiveDirectoryIterator(
__DIR__,
RecursiveDirectoryIterator::SKIP_DOTS
);
$iterator = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator($innerIterator, $filter)
);
$phar = new PharData('project.tar');
$phar->buildFromIterator($iterator, __DIR__);
【讨论】:
以上是关于PHP PharData:从目录构建 .tar 存档,带有排除项的主要内容,如果未能解决你的问题,请参考以下文章