Overview

Packages

  • Auth
  • Config
  • Controller
  • Date
  • Db
  • Feed
    • Abstract
    • Writers
  • File
    • Decorator
  • Form
    • Element
  • Image
  • Log
    • Writer
  • Net
    • Exception
  • None
  • PHP
  • PHPMailer
  • Session
  • Util
  • Validate
    • Validator
  • Zend
    • Registry

Classes

  • File_Crypt
  • File_FileCSV
  • File_FileManager
  • File_FolderManager
  • File_Upload
  • File_Util
  • Overview
  • Package
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * Pry Framework
  4:  *
  5:  * LICENSE
  6:  *
  7:  * This source file is subject to the new BSD license that is bundled
  8:  * with this package in the file LICENSE.txt.
  9:  * 
 10:  * @version $Revision: 276 $
 11:  */
 12: 
 13: /**
 14:  * Gestion de dossier
 15:  * @category Pry
 16:  * @package File
 17:  * @version 1.4.0
 18:  * @author Olivier ROGER <oroger.fr>
 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:      * Constructeur
 32:      *
 33:      * @param string $path Dossier
 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:      * Liste les fichiers du dossier en fonctions des filtres
 50:      *
 51:      * @param boolean $humanSize Si true taille retournée sous forme lisible (5Mo) sinon en Ko
 52:      * @return array
 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:      * Liste récursivement un dossier
 81:      *
 82:      * @since 1.1.0
 83:      * @return array
 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:             //echo str_repeat('-',$folder->getDepth()).' '.$file.'<br />';
 98:         }
 99:         return $liste;
100:     }
101: 
102:     /**
103:      * Récupère les x derniers fichiers modifiés dans un dossier.
104:      * Attention à la consomation mémoire sur gros dossier
105:      *
106:      * @param int $nbFile Nombre de fichier à récupérer
107:      * @param boolean $humanSize Retourne la date en octet ou sous forme lisible
108:      * @since 1.1.9
109:      * @return array
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:                 //tableau des premier fichier
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:                 //echo str_repeat('-',$dossier->getDepth()).' '.$file.'<br />';
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:      * Calcul la taille occupé par un dossier et tous ses sous dossiers
151:      *
152:      * @since 1.1.0
153:      * @return float
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:      * Calcul la taille occupé par un dossier et tous ses sous dossiers. Version static
169:      * Non soumis aux filtres
170:      *
171:      * @since 1.1.6
172:      * @param Dossier à mesurer
173:      * @static
174:      * @return float
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:      * Liste les dossiers présents
191:      * @since 1.0.5
192:      * @return unknown
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:      * Ajoute un ou plusieurs filtres
211:      *
212:      * @param mixed $filter Filtres à lister
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:      * Supprime un filtre
224:      *
225:      * @param string $filter
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:      * Crée un dossier
238:      *
239:      * @param string $newDir Chemin vers le dossier
240:      * @param int $chmod Chmod en octal
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:      * Supprime un dossier et tout son contenu
250:      *
251:      * @param string $dir Dossier à supprimer
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; // Libère l'itérateur sinon erreur d'accès lors de la suppression
274:         rmdir($dir);
275:         //echo "rmdir($dir)<br />";
276:     }
277: 
278:     /**
279:      * Supprime uniquement les fichiers présents dans un dossier
280:      * @since 1.2.0
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; // Libère l'itérateur sinon erreur d'accès lors de la suppression
296:     }
297: 
298:     /**
299:      * Copie du contenu d'un dossier dans un autre
300:      *
301:      * @since 1.1.5
302:      * @todo Proposer en option la copie du dossier et non pas que du contenu
303:      * @param string $dest Dossier de destination
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:                 //Suppression du nom du dossier source.
332:                 $pos = stripos($src,DIRECTORY_SEPARATOR);
333:                 copy($src,$dest.substr($src,$pos+1));
334:             }
335:             $folder->next();
336:         }
337:     }
338: 
339:     /**
340:      * Zip tous les fichiers du dossier.
341:      * Prend en compte les éventuels filtres
342:      * @param string $fileName Nom de l'archive
343:      * @since 1.2.2
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: }
Pry Framework API documentation generated by ApiGen 2.6.1