2011-08-22 14 views
7

El siguiente código:RecursiveDirectoryIterator lanza UnexpectedValueException en "Demasiados archivos abiertos"

$zip = new ZipArchive(); 

if ($zip->open('./archive.zip', ZIPARCHIVE::CREATE) !== TRUE) { 
    die ("Could not open archive"); 
} 

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./folder/")); 

foreach ($iterator as $key => $value) { 
    try { 
    $zip->addFile(realpath($key), $key); 
    echo "'$key' successfully added.\n"; 
    } catch (Exception $e) { 
    echo "ERROR: Could not add the file '$key': $e\n"; 
    } 
} 

$zip->close(); 

desencadena la siguiente excepción si hay demasiados archivos en una subcarpeta que se está tratando de iterar sobre: ​​

Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(./some/path/): failed to open dir: Too many open files' in /some/other/path/zip.php:24 
Stack trace: 
#0 [internal function]: RecursiveDirectoryIterator->__construct('./some/path/') 
#1 /some/other/path/zip.php(24): RecursiveDirectoryIterator->getChildren() 
#2 {main} 
thrown in /some/other/path/zip.php on line 24 

¿Cómo se puede repetir con éxito en una gran cantidad de carpetas y archivos sin experimentar esta excepción?

Respuesta

7

Simplemente mediante la conversión del iterador para una matriz con la función iterator_to_array, parece que se puede iterar sobre todos los archivos que desea:

Cuestiones relacionadas