* array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', * 'other.php' => 'Some more text content', * 'Invalid.csv' => 'Something else', * ), * 'AnEmptyFolder' => array(), * 'badlocation.php' => 'some bad content', * ) * ) * * the resulting directory tree will look like this: *
     * root
     * \- Core
     *  |- badlocation.php
     *  |- AbstractFactory
     *  | |- test.php
     *  | |- other.php
     *  | \- Invalid.csv
     *  \- AnEmptyFolder
     * 
* Arrays will become directories with their key as directory name, and * strings becomes files with their key as file name and their value as file * content. * * @param string $rootDirName name of root directory * @param int $permissions file permissions of root directory * @param array $structure directory structure to add under root directory * @return \org\bovigo\vfs\vfsStreamDirectory * @since 0.7.0 * @see https://github.com/mikey179/vfsStream/issues/14 * @see https://github.com/mikey179/vfsStream/issues/20 */ public static function setup($rootDirName = 'root', $permissions = null, array $structure = array()) { vfsStreamWrapper::register(); return self::create($structure, vfsStreamWrapper::setRoot(self::newDirectory($rootDirName, $permissions))); } /** * creates vfsStream directory structure from an array and adds it to given base dir * * Assumed $structure contains an array like this: * * array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', * 'other.php' => 'Some more text content', * 'Invalid.csv' => 'Something else', * ), * 'AnEmptyFolder' => array(), * 'badlocation.php' => 'some bad content', * ) * ) * * the resulting directory tree will look like this: *
     * baseDir
     * \- Core
     *  |- badlocation.php
     *  |- AbstractFactory
     *  | |- test.php
     *  | |- other.php
     *  | \- Invalid.csv
     *  \- AnEmptyFolder
     * 
* Arrays will become directories with their key as directory name, and * strings becomes files with their key as file name and their value as file * content. * * If no baseDir is given it will try to add the structure to the existing * root directory without replacing existing childs except those with equal * names. * * @param array $structure directory structure to add under root directory * @param vfsStreamDirectory $baseDir base directory to add structure to * @return vfsStreamDirectory * @throws \InvalidArgumentException * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/14 * @see https://github.com/mikey179/vfsStream/issues/20 */ public static function create(array $structure, vfsStreamDirectory $baseDir = null) { if (null === $baseDir) { $baseDir = vfsStreamWrapper::getRoot(); } if (null === $baseDir) { throw new \InvalidArgumentException('No baseDir given and no root directory set.'); } return self::addStructure($structure, $baseDir); } /** * helper method to create subdirectories recursively * * @param array $structure subdirectory structure to add * @param vfsStreamDirectory $baseDir directory to add the structure to * @return vfsStreamDirectory */ protected static function addStructure(array $structure, vfsStreamDirectory $baseDir) { foreach ($structure as $name => $data) { $name = (string) $name; if (is_array($data) === true) { self::addStructure($data, self::newDirectory($name)->at($baseDir)); } elseif (is_string($data) === true) { $matches = null; preg_match('/^\[(.*)\]$/', $name, $matches); if ($matches !== array()) { self::newBlock($matches[1])->withContent($data)->at($baseDir); } else { self::newFile($name)->withContent($data)->at($baseDir); } } elseif ($data instanceof FileContent) { self::newFile($name)->withContent($data)->at($baseDir); } elseif ($data instanceof vfsStreamFile) { $baseDir->addChild($data); } } return $baseDir; } /** * copies the file system structure from given path into the base dir * * If no baseDir is given it will try to add the structure to the existing * root directory without replacing existing childs except those with equal * names. * File permissions are copied as well. * Please note that file contents will only be copied if their file size * does not exceed the given $maxFileSize which defaults to 1024 KB. In case * the file is larger file content will be mocked, see * https://github.com/mikey179/vfsStream/wiki/MockingLargeFiles. * * @param string $path path to copy the structure from * @param vfsStreamDirectory $baseDir directory to add the structure to * @param int $maxFileSize maximum file size of files to copy content from * @return vfsStreamDirectory * @throws \InvalidArgumentException * @since 0.11.0 * @see https://github.com/mikey179/vfsStream/issues/4 */ public static function copyFromFileSystem($path, vfsStreamDirectory $baseDir = null, $maxFileSize = 1048576) { if (null === $baseDir) { $baseDir = vfsStreamWrapper::getRoot(); } if (null === $baseDir) { throw new \InvalidArgumentException('No baseDir given and no root directory set.'); } $dir = new \DirectoryIterator($path); foreach ($dir as $fileinfo) { switch (filetype($fileinfo->getPathname())) { case 'file': if ($fileinfo->getSize() <= $maxFileSize) { $content = file_get_contents($fileinfo->getPathname()); } else { $content = new LargeFileContent($fileinfo->getSize()); } self::newFile( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) ) ->withContent($content) ->at($baseDir); break; case 'dir': if (!$fileinfo->isDot()) { self::copyFromFileSystem( $fileinfo->getPathname(), self::newDirectory( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) )->at($baseDir), $maxFileSize ); } break; case 'block': self::newBlock( $fileinfo->getFilename(), octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) )->at($baseDir); break; } } return $baseDir; } /** * returns a new file with given name * * @param string $name name of file to create * @param int $permissions permissions of file to create * @return vfsStreamFile */ public static function newFile($name, $permissions = null) { return new vfsStreamFile($name, $permissions); } /** * returns a new directory with given name * * If the name contains slashes, a new directory structure will be created. * The returned directory will always be the parent directory of this * directory structure. * * @param string $name name of directory to create * @param int $permissions permissions of directory to create * @return vfsStreamDirectory */ public static function newDirectory($name, $permissions = null) { if ('/' === $name{0}) { $name = substr($name, 1); } $firstSlash = strpos($name, '/'); if (false === $firstSlash) { return new vfsStreamDirectory($name, $permissions); } $ownName = substr($name, 0, $firstSlash); $subDirs = substr($name, $firstSlash + 1); $directory = new vfsStreamDirectory($ownName, $permissions); if (is_string($subDirs) && strlen($subDirs) > 0) { self::newDirectory($subDirs, $permissions)->at($directory); } return $directory; } /** * returns a new block with the given name * * @param string $name name of the block device * @param int $permissions permissions of block to create * @return vfsStreamBlock */ public static function newBlock($name, $permissions = null) { return new vfsStreamBlock($name, $permissions); } /** * returns current user * * If the system does not support posix_getuid() the current user will be root (0). * * @return int */ public static function getCurrentUser() { return function_exists('posix_getuid') ? posix_getuid() : self::OWNER_ROOT; } /** * returns current group * * If the system does not support posix_getgid() the current group will be root (0). * * @return int */ public static function getCurrentGroup() { return function_exists('posix_getgid') ? posix_getgid() : self::GROUP_ROOT; } /** * use visitor to inspect a content structure * * If the given content is null it will fall back to use the current root * directory of the stream wrapper. * * Returns given visitor for method chaining comfort. * * @param vfsStreamVisitor $visitor the visitor who inspects * @param vfsStreamContent $content directory structure to inspect * @return vfsStreamVisitor * @throws \InvalidArgumentException * @since 0.10.0 * @see https://github.com/mikey179/vfsStream/issues/10 */ public static function inspect(vfsStreamVisitor $visitor, vfsStreamContent $content = null) { if (null !== $content) { return $visitor->visit($content); } $root = vfsStreamWrapper::getRoot(); if (null === $root) { throw new \InvalidArgumentException('No content given and no root directory set.'); } return $visitor->visitDirectory($root); } /** * sets quota to given amount of bytes * * @param int $bytes * @since 1.1.0 */ public static function setQuota($bytes) { vfsStreamWrapper::setQuota(new Quota($bytes)); } /** * checks if vfsStream lists dotfiles in directory listings * * @return bool * @since 1.3.0 */ public static function useDotfiles() { return self::$dotFiles; } /** * disable dotfiles in directory listings * * @since 1.3.0 */ public static function disableDotfiles() { self::$dotFiles = false; } /** * enable dotfiles in directory listings * * @since 1.3.0 */ public static function enableDotfiles() { self::$dotFiles = true; } }