2011-10-29 68 views
0
之外的所有文件

下面的函數將返回來自給定目錄(包括所有子目錄)的XML文件數組。如何通過傳遞第二個可選參數來排除目錄來修改此函數。讀取目錄中除

E.g: 
getDirXmlFiles($config_dir, "example2"); 

Directory/Files 
    /file1.xml 
    /file2.xml 
    /examples/file3.xml 
    /examples/file4.xml 
    /example2/file5.xml 
    /example2/file5.xml 

在上述情況下,該函數將返回除example2目錄中的文件之外的所有文件。

function getDirXmlFiles($base) {   

    $files = array();  
    if(!is_dir($base)) return $files; 

    if ($handle = opendir($base)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == "..") continue; 

      if(is_dir("$base/$file")) {     
       $subfiles = $this->getDirXmlFiles("$base/$file"); 
       $files = array_merge($files, $subfiles);      
      } else {      
       if(Cms_File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 
    } 
    return $files; 
} 

回答

0

重新定義功能輸入:

function getDirXmlFiles($base, $excludeDir) { 

然後改變這一行:

if(is_dir("$base/$file")) { 

這樣:

if(is_dir("$base/$file") && "$base/$file" != "$base/$excludeDir") { 
+0

如果您只能測試「正在移動」的部分「$ file!= $ excludeDir',則首先創建2個用於測試的新字符串,第二種解決方案將僅排除第一級目錄上的文件,而不排除在較低的子目錄'$ this-> getDirXmlFiles(「$ base/$ file」,$ excludeDir);',第三,你應該說服新手將字符串串聯起來用'.'運算符)來獲得最佳實踐,第四你應該說服新手連接字符串只有一次不是每次需要時 –

0

您只需稍微修改功能檢查,看看如果當前目錄是要排除一個或不

function getDirXmlFiles($base,$exclude) {   

    $files = array();  
    if(!is_dir($base)) return $files; 

    if ($handle = opendir($base)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == "..") continue; 

      if(is_dir("$base/$file") && $file != $exclude) {     
       $subfiles = $this->getDirXmlFiles("$base/$file",$exclude); 
       $files = array_merge($files, $subfiles);      
      } else {      
       if(Cms_File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 
    } 
    return $files; 
} 
+0

很肯定這將無法正常工作......你應該檢查'$ file',不'$ base' ... – DaveRandom

+0

@DaveRandom好點,我將修改它。 –

1

試試這個:

function getDirXmlFiles($base, $exclude = NULL) {   

    $files = array();  
    if(!is_dir($base)) return $files; 

    if ($handle = opendir($base)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file == "." || $file == ".." || "$base/$file" == $exclude) continue; 

      if(is_dir("$base/$file")) {     
       $subfiles = $this->getDirXmlFiles("$base/$file",$exclude); 
       $files = array_merge($files, $subfiles);      
      } else {      
       if(Cms_File::type($file,false) == "xml") 
        $files[] = "$base/$file"; 
      } 
     } 
     closedir($handle); 
    } 
    return $files; 
} 
+0

這隻會在發送目錄的完整路徑時纔會排除certan目錄,而不是certan目錄名稱 –

0

不便之類的(只測試了語法驗證有可能需要一些小的調試)(這將讓你排除多個目錄名)

function getDirXmlFiles($base, $excludeArray = array()) {  

    if (!is_array($excludeArray)) 
     throw new Exception(__CLASS__ . "->" . __METHOD__ . " expects second argument to be a valid array"); 

    $files = array();  
    if(!is_dir($base)) return $files; 

    if ($handle = opendir($base)) { 
     while (false !== ($file = readdir($handle))) { 

      $path = $base . "/" . $file; 
      $isDir = is_dir($path); 

      if (
       $file == "." 
       || $file == ".." 
       || (
        $isDir 
        && count($excludeArray) > 0 
        && in_array($file, $excludeArray) 
       ) 
      ) 
       continue; 

      if($isDir) {     
       $subfiles = $this->getDirXmlFiles($path, $excludeArray); 
       $files = array_merge($files, $subfiles);      
      } else {      
       if(Cms_File::type($file,false) == "xml") 
        $files[] = $path; 
      } 
     } 
     closedir($handle); 
    } 
    return $files; 
} 
+1

我相信這個答案只會在函數屬於一個對象並且腳本在PHP> = 5.0上運行時才起作用.0(引入'__METHOD__'魔術常數時)。 – jsleuth

+0

@JeffSlutz我認爲這個函數屬於一個類,因爲他調用方法(函數)遞歸與'$ this-> getDirXmlFil..' –

+0

正確的你,非常好的一點。 :) – jsleuth