2010-06-23 3 views
0

J'ai un dossier, qui contient d'autres dossiers, qui peuvent contenir ou non d'autres dossiers, où les fichiers peuvent résider. Je veux analyser toute la structure dir, et trouver des fichiers de plus de 100 Mo, et déplacer ces fichiers vers le répertoire de niveau supérieur.Comment trouver des fichiers volumineux dans une arborescence de répertoires, en php?

Quel est un bon moyen d'accomplir cela, en PHP?

Par exemple:

/data/1/subfolder/id33/big_file.avi 
/data/4/another_big_file.avi 
/data/56/something/big_file2.avi 

je dois déplacer ces 3 fichiers, dans /data

Répondre

1
class MyFilterIterator extends FilterIterator { 
    public function accept() { 
     return $this->getSize() > 100*1024*1024; 
    } 
} 

$it = new MyFilterIterator(new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator("/data"))); 

foreach($it as $file) { 
    //move ... 
} 
+1

Au lieu de 'filesize (parent: : current()) ', que diriez-vous d'utiliser' $ this-> getSize() 'ou avec moins * magic *,' $ this-> current() -> getSize() 'ou, enfin, si vous devez vraiment' parent :: current() -> getSize() '? – salathe

+0

Dès que j'essaie d'exclure les fichiers plus petits, il arrête de lire les répertoires inférieurs même s'ils ont des fichiers suffisamment volumineux) –

+0

@sal wow '$ this-> getSize()' est très malade. J'ai été curieux de savoir comment ça fonctionnait la magie est dans le gestionnaire 'get_method' des" itérateurs doubles "(itérateurs qui encapsulent d'autres itérateurs): http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3 /ext/spl/spl_iterators.c?revision=298633&view=markup#l1161 – Artefacto

2

Numérisez tous les sous-dossiers avec

$it = new RecursiveDirectoryIterator("/data"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    //work with file (which is simplya a path here actually) here 
} 

vous allez ajouter une condition là, comme

if (filesize($file) > 100e6) { 
    rename($file, '/data/filename...'); 
} 
Questions connexes