nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							140 lines
						
					
					
						
							4.0 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
								 * This file is part of the Symfony package.
							 | 
						|
								 *
							 | 
						|
								 * (c) Fabien Potencier <fabien@symfony.com>
							 | 
						|
								 *
							 | 
						|
								 * For the full copyright and license information, please view the LICENSE
							 | 
						|
								 * file that was distributed with this source code.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								namespace Symfony\Component\Finder\Iterator;
							 | 
						|
								
							 | 
						|
								use Symfony\Component\Finder\Exception\AccessDeniedException;
							 | 
						|
								use Symfony\Component\Finder\SplFileInfo;
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Extends the \RecursiveDirectoryIterator to support relative paths.
							 | 
						|
								 *
							 | 
						|
								 * @author Victor Berchet <victor@suumit.com>
							 | 
						|
								 */
							 | 
						|
								class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * @var bool
							 | 
						|
								     */
							 | 
						|
								    private $ignoreUnreadableDirs;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var bool
							 | 
						|
								     */
							 | 
						|
								    private $rewindable;
							 | 
						|
								
							 | 
						|
								    // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations
							 | 
						|
								    private $rootPath;
							 | 
						|
								    private $subPath;
							 | 
						|
								    private $directorySeparator = '/';
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @throws \RuntimeException
							 | 
						|
								     */
							 | 
						|
								    public function __construct(string $path, int $flags, bool $ignoreUnreadableDirs = false)
							 | 
						|
								    {
							 | 
						|
								        if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
							 | 
						|
								            throw new \RuntimeException('This iterator only support returning current as fileinfo.');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        parent::__construct($path, $flags);
							 | 
						|
								        $this->ignoreUnreadableDirs = $ignoreUnreadableDirs;
							 | 
						|
								        $this->rootPath = $path;
							 | 
						|
								        if ('/' !== \DIRECTORY_SEPARATOR && !($flags & self::UNIX_PATHS)) {
							 | 
						|
								            $this->directorySeparator = \DIRECTORY_SEPARATOR;
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Return an instance of SplFileInfo with support for relative paths.
							 | 
						|
								     *
							 | 
						|
								     * @return SplFileInfo File information
							 | 
						|
								     */
							 | 
						|
								    public function current()
							 | 
						|
								    {
							 | 
						|
								        // the logic here avoids redoing the same work in all iterations
							 | 
						|
								
							 | 
						|
								        if (null === $subPathname = $this->subPath) {
							 | 
						|
								            $subPathname = $this->subPath = (string) $this->getSubPath();
							 | 
						|
								        }
							 | 
						|
								        if ('' !== $subPathname) {
							 | 
						|
								            $subPathname .= $this->directorySeparator;
							 | 
						|
								        }
							 | 
						|
								        $subPathname .= $this->getFilename();
							 | 
						|
								
							 | 
						|
								        return new SplFileInfo($this->rootPath.$this->directorySeparator.$subPathname, $this->subPath, $subPathname);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @return \RecursiveIterator
							 | 
						|
								     *
							 | 
						|
								     * @throws AccessDeniedException
							 | 
						|
								     */
							 | 
						|
								    public function getChildren()
							 | 
						|
								    {
							 | 
						|
								        try {
							 | 
						|
								            $children = parent::getChildren();
							 | 
						|
								
							 | 
						|
								            if ($children instanceof self) {
							 | 
						|
								                // parent method will call the constructor with default arguments, so unreadable dirs won't be ignored anymore
							 | 
						|
								                $children->ignoreUnreadableDirs = $this->ignoreUnreadableDirs;
							 | 
						|
								
							 | 
						|
								                // performance optimization to avoid redoing the same work in all children
							 | 
						|
								                $children->rewindable = &$this->rewindable;
							 | 
						|
								                $children->rootPath = $this->rootPath;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return $children;
							 | 
						|
								        } catch (\UnexpectedValueException $e) {
							 | 
						|
								            if ($this->ignoreUnreadableDirs) {
							 | 
						|
								                // If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
							 | 
						|
								                return new \RecursiveArrayIterator(array());
							 | 
						|
								            } else {
							 | 
						|
								                throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Do nothing for non rewindable stream.
							 | 
						|
								     */
							 | 
						|
								    public function rewind()
							 | 
						|
								    {
							 | 
						|
								        if (false === $this->isRewindable()) {
							 | 
						|
								            return;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        parent::rewind();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Checks if the stream is rewindable.
							 | 
						|
								     *
							 | 
						|
								     * @return bool true when the stream is rewindable, false otherwise
							 | 
						|
								     */
							 | 
						|
								    public function isRewindable()
							 | 
						|
								    {
							 | 
						|
								        if (null !== $this->rewindable) {
							 | 
						|
								            return $this->rewindable;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        if (false !== $stream = @opendir($this->getPath())) {
							 | 
						|
								            $infos = stream_get_meta_data($stream);
							 | 
						|
								            closedir($stream);
							 | 
						|
								
							 | 
						|
								            if ($infos['seekable']) {
							 | 
						|
								                return $this->rewindable = true;
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        return $this->rewindable = false;
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |