排除子目录php

排除子目录php,php,subdirectory,Php,Subdirectory,我想列出目录中的所有文件,并排除子目录中的新文件 我尝试使用if$file!=新文件 但一切都不会改变 foreach (ListFiles("/data") as $key=>$file){ if($file != "newfiles"){ $files=array_pop(explode('/',$file)); $lfile[]=$files; } } function ListFiles($dir) { if($dh = opendir($dir)) {

我想列出目录中的所有文件,并排除子目录中的新文件

我尝试使用if$file!=新文件 但一切都不会改变

foreach (ListFiles("/data") as $key=>$file){

if($file != "newfiles"){ 
$files=array_pop(explode('/',$file)); 
$lfile[]=$files;
}

}


function ListFiles($dir) { 

    if($dh = opendir($dir)) { 

        $files = Array(); 
        $inner_files = Array(); 

        while($file = readdir($dh)) { 
            if($file != "." && $file != ".." && $file[0] != '.') { 
                if(is_dir($dir . "/" . $file)) { 
                    $inner_files = ListFiles($dir . "/" . $file); 
                    if(is_array($inner_files)) $files = array_merge($files, $inner_files); 
                } else { 
                    array_push($files, $dir . "/" . $file); 
                } 
            } 
        } 

        closedir($dh); 
        return $files; 
    } 
}  

您可以使用下面的函数来排除所需的目录

  function glob_deep($pattern, $exclude = array(), $flags = 0)
   {
     $files = glob($pattern, $flags);
     foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
     {
       if(!in_array($dir, $exclude)) {
          $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
       }
     }
  return $files;
  }
就这样说吧

$files =  glob_deep('data', array('newfiles'));
var_dump($files);
希望这有帮助

您应该检查它是否为/data/newfiles而不是just/newfiles,因为$file变量返回的是整个位置,而不仅仅是文件名

我们检查$file变量是否包含字符串data/newfiles。如果匹配,则表示该文件位于子目录中

foreach (ListFiles("/data") as $key=>$file){
    /* Only continue if the $file variable doesn't have the string "data/newfiles" */
    if(!preg_match("/data\/newfiles/", $file)){ 
        $files=array_pop(explode('/', $file)); 
        $lfile[]=$files;
    }
}
我们只在它不匹配的情况下将其添加到$lfile数组中,这意味着文件不在newfiles子目录中

foreach (ListFiles("/data") as $key=>$file){
    /* Only continue if the $file variable doesn't have the string "data/newfiles" */
    if(!preg_match("/data\/newfiles/", $file)){ 
        $files=array_pop(explode('/', $file)); 
        $lfile[]=$files;
    }
}

/数据指向文件系统根目录中的数据文件夹。我想你的意思是./data.

如果你想列出所有文件,请使用此选项

`find /data -type f`
`find /data/!(newfiles) -type f`

如果要列出所有文件并排除名为newfiles的目录,请使用

`find /data -type f`
`find /data/!(newfiles) -type f`
如果还想排除目录坏文件

 `find /data/!(newfiles|badfiles) -type f`
如果你想要文件和目录

`find /data/!(newfiles)`
等等,不要贬低我。它当然是一个shell可执行文件, 在php中,您可以运行如下shell脚本:

$output = shell_exec('find /data/!(newfiles|badfiles) -type f');
print_r($output);

玩得开心

你能提供一个目录树的例子吗?文件1-2-3-…-新闻文件newfiles或newfiles?这是如何回答问题的?它既不像他的例子那样是递归的,也不排除他想要排除的目录。目录有许多其他子目录,我想排除一个。问题函数listfile打开所有子目录并列出所有文件,我需要函数ignore子目录和所有文件