php получает список всех подкаталогов и всех файлов - PullRequest
1 голос
/ 11 декабря 2011

Каков наилучший способ получить список всех подкаталогов и другой список всех файлов в данном каталоге в php.Я в порядке с не чистым кодом php, если я могу использовать его из php (например, программа ac / java / python / ...).Что-то быстрее, чем чистый recursion, что-то встроенное в какой-то язык (так как эти вещи, как правило, бывают быстрыми).

Ответы [ 6 ]

4 голосов
/ 11 декабря 2011

Посмотрите на RecursiveDirectoryIterator:

foreach (new RecursiveDirectoryIterator('yourDir') as $file) {
    // you don't want the . and .. dirs, do you?
    if ($file->isDot()) {
        continue;
    }

    if ($file->isDir()) {
        // dir
    } else {
        // file
    }
}
2 голосов
/ 11 декабря 2011

И если вам не нравятся OOing, вы можете запустить цикл opendir () для результатов поиска.

if (exec('find /startdir -type d -print', $outputarray)) {
  foreach ($outputarray as $onepath) {
    // do stuff in $onepath
  }
}

Вы указали "не чистый PHP", как вариант, верно? : -)

1 голос
/ 11 декабря 2011
class Dir_helper{
    public function __construct(){

    }
    public function getWebdirAsArray($rootPath){
        $l1 = scandir($rootPath);
        foreach ($this->getFileList($rootPath) as $r1){
        if ($r1['type'] == 'dir'){
            if (preg_match("/\./", $r1['name'])){
            $toplevel[] =  $r1['name'];
            } else {
            if (preg_match("/\d/",$r1['name'])){
                $seclevel[] = $this->getFileList($r1['name']);
            }
            }
        }
        }
        foreach ($seclevel as $sl){
        foreach ($sl as $cur){
            $sub[] = $cur['name'];
        }
        }
        return $result = array_merge((array)$toplevel, (array)$sub);
    }

    public function getFileList($dir){
        $retval = array();
        if(substr($dir, -1) != "/") $dir .= "/";
        $d = @dir($dir) or die("getFileList: Failed opening directory $dir for reading");
        while(false !== ($entry = $d->read())) {
            if($entry[0] == ".") continue;
            if(is_dir("$dir$entry")) {
                $retval[] = array(
                "name" => "$dir$entry/",
                "type" => filetype("$dir$entry"),
                "size" => 0,
                "lastmod" => filemtime("$dir$entry")
                );
            } elseif(is_readable("$dir$entry")) {
                $retval[] = array(
                "name" => "$dir$entry",
                "type" => mime_content_type("$dir$entry"),
                "size" => filesize("$dir$entry"),
                "lastmod" => filemtime("$dir$entry")
                );
            }
        }
        $d->close();
        return $retval;
    }

}
1 голос
/ 11 декабря 2011

взято из php.net s документации по glob () :

$path[] = 'starting_place/*';

while(count($path) != 0) {
  $v = array_shift($path);

  foreach(glob($v) as $item) {
    if(is_dir($item))
      $path[] = $item . '/*';
    else if (is_file($item)) {
      //do something
    }
  }
}
0 голосов
/ 11 августа 2018

Так как вы не хотите рекурсии, я просто написал это с несколькими дополнительными битами

// $dirs = [];
// Get All Files & Folders in $dir
$files = glob("$dir/*");
for ($i=0; $i < count($files); $i++) { 
    if (is_dir($files[$i])) {
        $files = array_merge($files, glob("$files[$i]/*"));
    //  $dirs[] = $files[$i]; // This can add the folder to a dir array
    }
}
// Remove folders from the list if you like
foreach ($files as $key => $file) {
    if (is_dir($file)) {
        unset($files[$key]);
    }
}
// Clean up the key numbers if you removed files or folders
$files = array_values($files);
0 голосов
/ 11 декабря 2011

использовать встроенный PHP RecursiveDirectoryIterator

EDIT

Что-то вроде:

$dirs  = array();
$files = array();

$dir = __DIR__ . '/foo';

$iterator = new RecursiveDirectoryIterator(new DirectoryIterator($dir));

foreach ($iterator as $dirElement) {
    if ($dirElement->isDir()) {
        $dirs[] $dirElement->getPathname();
    }
    if ($dirElement->isFile()) {
        $files[] = $dirElement->getPathname();
    }
}
...