-
Notifications
You must be signed in to change notification settings - Fork 7
/
Directory.php
140 lines (125 loc) · 2.83 KB
/
Directory.php
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php
/*
* This file is part of the php-vfs package.
*
* (c) Michael Donat <michael.donat@me.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace VirtualFileSystem\Structure;
use VirtualFileSystem\FileExistsException;
use VirtualFileSystem\NotFoundException;
/**
* FileSystem Directory representation.
*
* @author Michael Donat <michael.donat@me.com>
* @package php-vfs
*/
class Directory extends Node
{
/**
* @see http://man7.org/linux/man-pages/man2/lstat.2.html
*/
const S_IFTYPE = 0040000;
protected $children = array();
/**
* Class constructor.
*
* @param string $basename
*
* @throws \InvalidArgumentException
*/
public function __construct($basename)
{
if ($basename == Root::BASENAME) {
throw new \InvalidArgumentException('Creating directories as root is prohibited');
}
parent::__construct($basename);
}
/**
* Adds child Directory.
*
* @param Directory $directory
*/
public function addDirectory(Directory $directory)
{
$this->addNode($directory);
}
/**
* Adds child File.
*
* @param File $file
*/
public function addFile(File $file)
{
$this->addNode($file);
}
/**
* Adds child Link.
*
* @param Link $link
*/
public function addLink(Link $link)
{
$this->addNode($link);
}
/**
* Adds child Node.
*
* @param Node $node
*
* @throws FileExistsException
*/
protected function addNode(Node $node)
{
if (array_key_exists($node->basename(), $this->children)) {
throw new FileExistsException(sprintf('%s already exists', $node->basename()));
}
$this->children[$node->basename()] = $node;
$node->setParent($this);
}
/**
* Returns size as the number of child elements.
*
* @return int
*/
public function size()
{
return count($this->children);
}
/**
* Returns child Node existing at path.
*
* @param string $path
*
* @return mixed
*
* @throws \VirtualFileSystem\NotFoundException
*/
public function childAt($path)
{
if (!array_key_exists($path, $this->children)) {
throw new NotFoundException(sprintf('Could not find child %s in %s', $path, $this->path()));
}
return $this->children[$path];
}
/**
* Removes child Node
*
* @param string $basename
*/
public function remove($basename)
{
unset($this->children[$basename]);
}
/**
* Returns children
*
* @return array
*/
public function children()
{
return $this->children;
}
}