php glob-escanear en subcarpetas para un archivo


Tengo un servidor con muchos archivos dentro de varias carpetas, subcarpetas y subcarpetas.

Estoy tratando de hacer una búsqueda.página php que se utilizaría para buscar un archivo específico en todo el servidor. Si se encuentra el archivo, devuelva la ruta de ubicación para mostrar un enlace de descarga.

Esto es lo que tengo hasta ahora:

$root = $_SERVER['DOCUMENT_ROOT'];
$search = "test.zip";
$found_files = glob("$root/*/test.zip");
$downloadlink = str_replace("$root/", "", $found_files[0]);
if (!empty($downloadlink)) {
    echo "<a href=\"http://www.example.com/$downloadlink\">$search</a>";
} 

El script funciona perfectamente si el archivo está dentro de la raíz de mi nombre de dominio... Ahora estoy tratando de encontrar una manera de hacerlo también escanear sub-carpetas y sub-carpetas, pero estoy atascado aquí.

Author: Marcio Mazzucato, 2013-06-18

2 answers

Hay 2 maneras.

Use glob para hacer una búsqueda recursiva:

<?php

// Does not support flag GLOB_BRACE
function rglob($pattern, $flags = 0) {
    $files = glob($pattern, $flags); 
    foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
        $files = array_merge($files, rglob($dir.'/'.basename($pattern), $flags));
    }
    return $files;
}

?>

Use RecursiveDirectoryIterator

<?php
function rsearch($folder, $pattern) {
    $dir = new RecursiveDirectoryIterator($folder);
    $ite = new RecursiveIteratorIterator($dir);
    $files = new RegexIterator($ite, $pattern, RegexIterator::GET_MATCH);
    $fileList = array();
    foreach($files as $file) {
        $fileList = array_merge($fileList, $file);
    }
    return $fileList;
}
?>

RecursiveDirectoryIterator viene con PHP5 mientras que glob es de PHP4. Ambos pueden hacer el trabajo, depende de ti.

 49
Author: Tony Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-15 18:09:05

Esto devuelve fullpath al archivo

function rsearch($folder, $pattern) {
    $iti = new RecursiveDirectoryIterator($folder);
    foreach(new RecursiveIteratorIterator($iti) as $file){
         if(strpos($file , $pattern) !== false){
            return $file;
         }
    }
    return false;
}

Llame a la función:

$filepath = rsearch('/home/directory/thisdir/', "/findthisfile.jpg");

Y esto es devuelve como:

/home/directory/thisdir/subdir/findthisfile.jpg

Puede mejorar esta función para encontrar varios archivos como todos los archivos jpeg:

function rsearch($folder, $pattern_array) {
    $return = array();
    $iti = new RecursiveDirectoryIterator($folder);
    foreach(new RecursiveIteratorIterator($iti) as $file){
        if (in_array(strtolower(array_pop(explode('.', $file))), $pattern_array)){
            $return[] = $file;
        }
    }
    return $return;
}

Esto puede llamar como:

$filepaths = rsearch('/home/directory/thisdir/', array('jpeg', 'jpg') );

Ref: https://stackoverflow.com/a/1860417/219112

 2
Author: Sadee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:17