【问题标题】:PHP PharData: build .tar archive from directory, with exclusionsPHP PharData:从目录构建 .tar 存档,带有排除项
【发布时间】: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'
);

这个例子可能是一个起点,但从这里我不知道如何从迭代器中排除文件列表?

【问题讨论】:

    标签: php phar


    【解决方案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__);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2015-12-15
      相关资源
      最近更新 更多