1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13: 14: 15: 16: 17: 18: 19: 20:
21:
22: class File_FolderManager
23: {
24: private $dossier;
25: private $dossierRecur;
26: private $listeFichier;
27: private $listeDossier;
28: private $filtre;
29:
30: 31: 32: 33: 34:
35: public function __construct($path)
36: {
37: $this->dossier = $path;
38: if(!is_dir($this->dossier))
39: throw new InvalidArgumentException('Le dossier recherché ne semble pas exister');
40: $this->dossierRecur = $this->dossier;
41: $this->listeFichier = array();
42: $this->folderTree = array();
43: $this->fileTree = array();
44: $this->tree = '';
45: $this->filtre = array();
46: }
47:
48: 49: 50: 51: 52: 53:
54: public function listFile($humanSize=false)
55: {
56: $folder = new File_Decorator_Filter(new DirectoryIterator($this->dossier));
57: $folder->setExtension($this->filtre);
58: $compteur = 0;
59: foreach($folder as $file)
60: {
61: if(!$file->isDot() && !$file->isDir())
62: {
63: $this->listeFichier[$compteur]['name'] = $file->getFilename();
64: if($humanSize)
65: {
66: $taille = $file->getSize();
67: $this->listeFichier[$compteur]['size'] = File_Util::getHumanSize($taille);
68: }
69: else
70: $this->listeFichier[$compteur]['size'] = round($file->getSize()/1024,3);
71: $this->listeFichier[$compteur]['type'] = File_Util::getExtension($this->listeFichier[$compteur]['name']);
72: $compteur++;
73: }
74: }
75: sort($this->listeFichier);
76: return $this->listeFichier;
77: }
78:
79: 80: 81: 82: 83: 84:
85: public function listRecursive()
86: {
87: $folder = new File_Decorator_Filter(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->dossier),true));
88: $folder->setExtension($this->filtre);
89: $liste = array();
90: $compteur = 0;
91: foreach($folder as $file)
92: {
93: $liste[$compteur]['name'] = $file->getFilename();
94: $liste[$compteur]['size'] = round($file->getSize()/1024,3);
95: $liste[$compteur]['depth'] = $folder->getDepth();
96: $compteur++;
97:
98: }
99: return $liste;
100: }
101:
102: 103: 104: 105: 106: 107: 108: 109: 110:
111: public function getLastFiles($nbFile=5,$humanSize = false)
112: {
113:
114: $dossier = new File_Decorator_Filter(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->dossier),true));
115: $dossier->setExtension($this->filtre);
116: $liste = array();
117: $compteur = 0;
118: foreach($dossier as $file)
119: {
120: if(!$file->isDir())
121: {
122:
123: $liste[$compteur]['name'] = $file->getFilename();
124: $liste[$compteur]['date'] = $file->getMTime();
125: $liste[$compteur]['path'] = $file->getPathName();
126:
127: $size = $file->getSize();
128: if($humanSize)
129: $liste[$compteur]['size'] = File_Util::getHumanSize($size);
130: else
131: $liste[$compteur]['size'] = round($size/1024,3);
132:
133:
134: }
135: $compteur++;
136: }
137: usort($liste,array('File_FolderManager','triParDate'));
138: array_splice($liste, $nbFile);
139: return array_reverse($liste);
140: }
141:
142: private static function triParDate($a,$b)
143: {
144: if($a['date']==$b['date'])
145: return 0;
146: return ($a['date']>$b['date'])?-1:1;
147: }
148:
149: 150: 151: 152: 153: 154:
155: public function getSize()
156: {
157: $dossier = new File_Decorator_Filter(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->dossier),true));
158: $dossier->setExtension($this->filtre);
159: $size = 0;
160: foreach($dossier as $file)
161: if(!$file->isDir())
162: $size+=round($file->getSize()/1024,3);
163:
164: return $size;
165: }
166:
167: 168: 169: 170: 171: 172: 173: 174: 175:
176: public static function getSizeStatic($folder)
177: {
178: if(!is_dir($folder))
179: throw new InvalidArgumentException('Le dossier ne semble pas exister');
180: $dossier = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder),true);
181: $size = 0;
182: foreach($dossier as $file)
183: if(!$file->isDir())
184: $size+=round($file->getSize()/1024,3);
185:
186: return $size;
187: }
188:
189: 190: 191: 192: 193:
194: public function liste()
195: {
196: $folder = new DirectoryIterator($this->dossier);
197: $compteur = 0;
198: foreach($folder as $file)
199: {
200: if(!$file->isDot() && $file->isDir())
201: {
202: $this->listeDossier[$compteur] = $file->getFilename();
203: $compteur++;
204: }
205: }
206: return $this->listeDossier;
207: }
208:
209: 210: 211: 212: 213:
214: public function setFilter($filter)
215: {
216: if(!is_array($filter))
217: $this->filtre[] = $filter;
218: else
219: $this->filtre = array_merge($this->filtre,$filter);
220: }
221:
222: 223: 224: 225: 226:
227: public function rmFilter($filter)
228: {
229: $cle = array_search($filter,$this->filtre);
230: if($cle!=FALSE)
231: unset($this->filtre[$cle]);
232: else
233: throw new InvalidArgumentException('Le filtre demandé n\'existe pas');
234: }
235:
236: 237: 238: 239: 240: 241:
242: public static function create($newDir,$chmod=0644)
243: {
244: if(!is_file($newDir))
245: @mkdir(Util_String::cleantitre($newDir),$chmod);
246: }
247:
248: 249: 250: 251: 252:
253: public function remove($dir='')
254: {
255: if($dir=='')
256: $dir = $this->dossier;
257:
258: $folder = new RecursiveDirectoryIterator($dir);
259: while($folder->valid())
260: {
261: if($folder->isDir() && !$folder->isDot())
262: {
263: if($folder->hasChildren())
264: self::remove($folder->getPathName());
265:
266: }
267: elseif($folder->isFile() && !$folder->isDot())
268: {
269: unlink($folder->getPathname());
270: }
271: $folder->next();
272: }
273: $folder = null;
274: rmdir($dir);
275:
276: }
277:
278: 279: 280: 281:
282: public function removeFiles()
283: {
284:
285: $folder = new File_Decorator_Filter(new DirectoryIterator($this->dossier));
286: $folder->setExtension($this->filtre);
287: $compteur = 0;
288: foreach($folder as $file)
289: {
290: if($file->isFile() && !$file->isDot())
291: {
292: unlink($file->getPathname());
293: }
294: }
295: $folder = null;
296: }
297:
298: 299: 300: 301: 302: 303: 304:
305: public function copy($dest,$dir='')
306: {
307: if(empty($dest))
308: throw new UnexpectedValueException('Le dossier de destination ne peut être vide');
309: if(!is_dir($dest))
310: self::create($dest,0777);
311:
312: if(empty($dir))
313: $dir = $this->dossier;
314:
315: $folder = new RecursiveDirectoryIterator($dir);
316: while($folder->valid())
317: {
318: if($folder->isDir() && !$folder->isDot())
319: {
320: if($folder->hasChildren())
321: {
322: $tmpPath = $dest.$folder->getFileName();
323: if(!is_dir($tmpPath))
324: self::create($tmpPath,0777);
325: $this->copy($dest,$folder->getPathname());
326: }
327: }
328: elseif($folder->isFile() && !$folder->isDot())
329: {
330: $src = $folder->getPathname();
331:
332: $pos = stripos($src,DIRECTORY_SEPARATOR);
333: copy($src,$dest.substr($src,$pos+1));
334: }
335: $folder->next();
336: }
337: }
338:
339: 340: 341: 342: 343: 344:
345: public function ZipFiles($fileName)
346: {
347: if(extension_loaded('zip')) {
348: $this->listFile();
349: $zip = new ZipArchive;
350: $res = $zip->open($this->dossier.$fileName, ZipArchive::CREATE);
351: if($res === TRUE) {
352: foreach($this->listeFichier as $file) {
353: $zip->addFile($this->dossier.$file['name'],$file['name']);
354: }
355: $zip->close();
356: } else {
357: throw new RuntimeException('Impossible de créer le zip');
358: }
359: } else {
360: throw new RuntimeException('Extension Zip non activée. Impossible de compresser les fichiers');
361: }
362: }
363: }