使用RecursiveIteratorIterator显示所有子文件和映射

时间:2017-11-24 13:43:48

标签: php iterator

我目前正在使用RecursiveIteratorIterator和RecursiveDirectoryIterator查看项目文件夹中的所有文件夹和文件(它从项目根文件夹开始)。

这个工具的重点是找到所有文件差异。问题是,它适用于我的本地主机,但不适用于服务器或同事的系统。


我在PHP 7.1.0上,就像我的同事一样

我使用以下代码作为迭代器

new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $startingPoint ), RecursiveIteratorIterator::SELF_FIRST );

' $ startingPoint'是项目的根位置。

完整的代码是

$startingPoint = realpath(__DIR__ . '../../'); # project root

#uncomment for list of files *down here*
$objects = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $startingPoint ), RecursiveIteratorIterator::SELF_FIRST );

foreach( (array) $objects as $name => $object  ) {
    if( strpos( $object->getPathName(), '.git' ) == FALSE && strpos( 
       $object->getPathName(), '.idea' ) == FALSE && strpos( $object->getPathName(), 'uploads' ) == FALSE && ! ( $object->getBaseName() == '.' || $object->getBaseName() == '..' ) ) {

    $fileLocation = str_replace( array( $startingPoint . '\\', '\\' ), array( '', '/' ), $object->getPathName() );

    #uncomment when generating a new list of directories
//                $filesShouldExist[] = [ "loc" => $fileLocation, "size" => $object->getSize() ];
    }
}

它将停止创建迭代器,并且不会给出任何错误。

请注意,此代码适用于(我的)窗口,但不适用于Mac。

1 个答案:

答案 0 :(得分:1)

来自PHP's documentation

  

__ DIR __ 该文件的目录。如果在include中使用,则返回包含文件的目录。这相当于   目录名(__ FILE__)。 此目录名称没有尾部斜杠   除非它是根目录。

因此,在路径中添加斜杠:

$startingPoint = realpath(__DIR__ . '/../../'); # note the added slash at the start of the string literal

并查看是否能解决您的问题。