php扫描目录在direcctories中

时间:2016-10-31 07:21:39

标签: php

问题是在子目录中,我有很多子目录和子子目录,我需要全部检查,也许有人知道如何帮助。

我的代码:

$mainFodlers = array_diff(scandir(self::PROJECT_DIRECTORY, 1), array('..', '.','__todo.txt'));

foreach ($mainFodlers as $mainFodler) { 

     if (is_dir(self::PROJECT_DIRECTORY . '/' . $mainFodler)) {

        $subFolders = array_diff(scandir(self::PROJECT_DIRECTORY . '/' . $mainFodler, 1), array('..', '.','__todo.txt', 'share_scripts.phtml'));

    } else {

        $extension = $this->getExtension($subFolder);

        if ($extension == 'phtml') {

            $file = $subFolder;

            $fileContent = file_get_contents(self::PROJECT_DIRECTORY . '/views/' . $file, true); 

        }

    }

}

1 个答案:

答案 0 :(得分:1)

因为我无法确定代码的最终结果,所以很难有效地回答,但是为了解决嵌套文件夹的问题,您可能希望考虑使用recursiveIterator类型的方法。以下代码应该为您提供一个良好的起点 - 它需要一个目录$dir并将遍历它和它的孩子。

/* Start directory */
$dir='c:/temp2';

/* Files & Folders to exclude */
$exclusions=array(
    'oem_no_drivermax.inf',
    'smwdm.sys',
    'file_x',
    'folder_x'
);

$dirItr = new RecursiveDirectoryIterator( $dir );
$filterItr = new DirFileFilter( $dirItr, $exclusions, $dir, 'all' );
$recItr = new RecursiveIteratorIterator( $filterItr, RecursiveIteratorIterator::SELF_FIRST );


foreach( $recItr as $filepath => $info ){
    $key = realpath( $info->getPathName() );
    $filename = $info->getFileName();
    echo 'Key = '.$key . ' ~ Filename = '.$filename.'<br />';
}

$dirItr = $filterItr = $recItr = null;

支持班级

class DirFileFilter extends RecursiveFilterIterator{

    protected $exclude;
    protected $root;
    protected $mode;

    public function __construct( $iterator, $exclude=array(), $root, $mode='all' ){
        parent::__construct( $iterator );
        $this->exclude = $exclude;
        $this->root = $root;
        $this->mode = $mode;
    }

    public function accept(){
        $folpath=rtrim( str_replace( $this->root, '', $this->getPathname() ), '\\' );
        $ext=strtolower( pathinfo( $this->getFilename(), PATHINFO_EXTENSION ) );

        switch( $this->mode ){
            case 'all': 
                return !( in_array( $this->getFilename(), $this->exclude ) or in_array( $folpath, $this->exclude ) or in_array( $ext, $this->exclude ) );
            case 'files':
                return ( $this->isFile() && ( !in_array( $this->getFilename(), $this->exclude ) or !in_array( $ext, $this->exclude ) ) );
            break;
            case 'dirs':
            case 'folders':
                return ( $this->isDir() && !( in_array( $this->getFilename(), $this->exclude ) ) && !in_array( $folpath, $this->exclude ) );
            break;
            default:
                echo 'config error: ' . $this->mode .' is not recognised';
            break;
        }
        return false;
    }
    public function getChildren(){
        return new self( $this->getInnerIterator()->getChildren(), $this->exclude, $this->root, $this->mode );
    }
}