1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116:
<?php
namespace Coast;
use Coast\Dir;
use Coast\File;
class Dir extends \Coast\File\Path implements \IteratorAggregate
{
public static function createTemp()
{
$path = str_replace(DIRECTORY_SEPARATOR, '/', rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . 'php' . uniqid());
if (!$path) {
throw new \Exception('Could not create tempoary directory');
}
return new \Coast\Dir($path, true);
}
public function __construct($path, $create = false)
{
parent::__construct($path);
if ($create && !$this->exists()) {
$this->create($create);
}
}
public function iterator($flags = null, $recursive = false, $mode = null)
{
return new \Coast\Dir\Iterator($this->_name, $flags, $recursive, $mode);
}
public function create()
{
$umask = umask(0);
mkdir($this->_name, 0777, true);
umask($umask);
return $this;
}
public function copy(\Coast\Dir $dir, $baseName = null, $recursive = false)
{
$name = "{$dir}/" . (isset($baseName)
? $this->_parseBaseName($baseName)
: $this->baseName());
$umask = umask(0);
mkdir($name, 0777, true);
if ($recursive) {
foreach ($this->iterator(null, true, \RecursiveIteratorIterator::SELF_FIRST) as $child) {
$copy = "{$name}/{$child->toRelative($this)}";
$child->isDir()
? mkdir($copy, 0777, true)
: copy($child->name(), $copy);
}
}
umask($umask);
return new \Coast\Dir($name);
}
public function remove($recursive = false)
{
if ($recursive) {
foreach ($this->iterator(null, true, \RecursiveIteratorIterator::CHILD_FIRST) as $child) {
$child->remove();
}
}
rmdir($this->_name);
return $this;
}
public function permissions($mode = null, $recursive = false)
{
if (isset($mode)) {
if ($recursive) {
foreach ($this->iterator(null, true, \RecursiveIteratorIterator::CHILD_FIRST) as $child) {
$child->chmod($mode);
}
}
chmod($this->_name, $mode);
return $this;
}
return parent::permissions();
}
public function size($recursive = false)
{
$size = 0;
foreach ($this->iterator(null, $recursive) as $path) {
if (!$path->exists()) {
continue;
}
$size += $path->size();
}
return $size;
}
public function file($path)
{
$path = ltrim($path, '/');
return new File("{$this->_name}/{$path}");
}
public function dir($path, $create = false)
{
$path = ltrim($path, '/');
return new Dir(strlen($path) ? "{$this->_name}/{$path}" : $this->_name, $create);
}
public function getIterator()
{
return $this->iterator();
}
}