1 <?php
2
3 4 5 6 7 8
9
10 namespace Hawk;
11
12 13 14 15 16
17 final class FileSystem extends Singleton{
18 19 20
21 const DS = DIRECTORY_SEPARATOR;
22
23 24 25
26 const FIND_FILE_ONLY = 'file';
27
28 29 30
31 const FIND_DIR_ONLY = 'dir';
32
33 34 35
36 const FIND_ANY_TYPE = 'any';
37
38 39 40 41 42
43 protected static $instance;
44
45
46 47 48 49 50 51 52
53 public function getAllFilesInDir($dir){
54 $files = array_merge(glob($dir . self::DS . '*'), glob($dir . self::DS . '.*'));
55 return array_filter(
56 $files, function ($file) {
57 return basename($file) != '.' && basename($file) != '..';
58 }
59 );
60 }
61
62 63 64 65 66 67
68 public function copy($source, $dest){
69 if(basename($source) == '*') {
70 foreach($this->getAllFilesInDir(dirname($source)) as $element){
71 $this->copy($element, $dest);
72 }
73 }
74 else{
75 if(! file_exists($source)) {
76 throw new FileSystemException('Cannot copy ' . $source . ' : No such file or directory');
77 }
78
79 if(is_file($source)) {
80
81 if(is_dir($dest)) {
82 $dest = $dest . self::DS . basename($source);
83 }
84 copy($source, $dest);
85 }
86 else{
87
88 $base = basename($source);
89 if(!is_dir($dest . self::DS . $base)) {
90 mkdir($dest . self::DS . $base, fileperms($source), true);
91 }
92
93
94 foreach(glob($source . self::DS . '*') as $element){
95 $this->copy($element, $dest . self::DS . $base);
96 }
97 }
98 }
99 }
100
101
102 103 104 105 106 107 108 109 110
111 public function find($source, $pattern, $type = self::FIND_ANY_TYPE){
112 if(!is_dir($source)) {
113 throw new FileSystemException(
114 'The method ' . __METHOD__ . ' requires the first argument to be an existing directory : ' .
115 $source . ' is not a directory'
116 );
117 }
118 switch($type){
119 case self::FIND_FILE_ONLY :
120 $result = array_filter(glob($source . self::DS . $pattern), 'is_file');
121 break;
122
123 case self::FIND_DIR_ONLY :
124 $result = glob($source . self::DS . $pattern, GLOB_ONLYDIR);
125 break;
126
127 default :
128 $result = glob($source . self::DS . $pattern);
129 break;
130 }
131
132 $subdirs = glob($source . self::DS . '*', GLOB_ONLYDIR);
133 foreach($subdirs as $dir){
134 $result = array_merge($result, self::find($dir, $pattern, $type));
135 }
136
137 return $result;
138 }
139
140
141 142 143 144 145 146 147
148 public function remove($source){
149 if(basename($source) == '*') {
150 foreach(self::getAllFilesInDir(dirname($source)) as $element){
151 $this->remove($element);
152 }
153 }
154 else{
155 if(! file_exists($source)) {
156 throw new FileSystemException('Cannot remove ' . $source . ' : No such file or directory');
157 }
158
159 if(is_file($source)) {
160
161 return unlink($source);
162 }
163 else{
164
165 foreach(self::getAllFilesInDir($source) as $element){
166 $this->remove($element);
167 }
168 return rmdir($source);
169 }
170 }
171 }
172 }
173
174
175 176 177 178 179
180 class FileSystemException extends \Exception{
181 }