2011-07-13 46 views
0

我有以下函數枚舉給定文件夾中的文件和目錄。它適用於執行子文件夾,但出於某種原因,它不希望在父目錄上工作。任何想法爲什麼?我想這可能是PHP的設置或什麼的東西,但我不知道從哪裏開始。如果是這樣,我運氣不好,因爲這將運行在一個便宜的共享主機設置。枚舉父目錄中的文件

下面介紹如何使用該功能。第一個參數是要枚舉的路徑,第二個參數是要忽略的過濾器列表。我試過傳遞下面列出的完整路徑。我試過只傳球.../..realpath('..')。似乎沒有任何工作。我知道這個功能並沒有默默地失敗。如果我手動添加一個目錄到dirs數組,我得到一個返回值。

$projFolder = '/hsphere/local/home/customerid/sitename/foldertoindex'; 
$items = enumerateDirs($projFolder, array(0 => "Admin", 1 => "inc")); 

這裏的函數本身

function enumerateDirs($directory, $filterList) 
{ 
    $handle = opendir($directory); 
    while (false !== ($item = readdir($handle))) 
    { 
     if ($item != "." && $item != ".." && $item != "inc" && array_search($item, $filterList) === false) 
     { 
      $path = "{$directory->path}/{$item}"; 

      if (is_dir($item)) 
      { 
       $tmp['name'] = $item; 
       $dirs[$item] = $tmp; 
       unset($tmp); 
      } 
      elseif (is_file($item)) 
      { 
       $tmp['name'] = $item; 
       $files[] = $tmp; 
       unset($tmp); 
      } 
     } 
    } 

    ksort($dirs, SORT_STRING); 
    sort($dirs); 

    ksort($files, SORT_STRING); 
    sort($files); 

    return array("dirs" => $dirs, "files" => $files); 
} 

回答

1

你混合起來執行opendir和目錄。您還需要將完整路徑(包括目錄組件)傳遞給is_dir和is_file。 (我認爲這就是你要用$ path做的。)否則,這些函數將在腳本文件的目錄中查找相應的文件系統對象。

試試這個速戰速決:

<?php 

function enumerateDirs($directory, $filterList) 
{ 
    $handle = dir($directory); 

    while (false !== ($item = $handle->read())) 
    { 
     if ($item != "." && $item != ".." && $item != "inc" && array_search($item, $filterList) === false) 
     { 
      $path = "{$handle->path}/{$item}"; 

      $tmp['name'] = $item; 

      if (is_dir($path)) 
      { 
       $dirs[] = $tmp; 
      } 
      elseif (is_file($path)) 
      { 
       $files[] = $tmp; 
      } 

      unset($tmp); 
     } 
    } 

    $handle->close(); 

    /* Anonymous functions will need PHP 5.3+. If your version is older, take a 
    * look at create_function 
    */ 
    $sortFunc = function ($a, $b) { return strcmp($a['name'], $b['name']); }; 

    usort($dirs, $sortFunc);  
    usort($files, $sortFunc); 

    return array("dirs" => $dirs, "files" => $files); 
} 

$ret = enumerateDirs('../', array()); 

var_dump($ret); 

注:$文件或$迪爾斯可能while循環後未設置。 (可能沒有文件或目錄。)在這種情況下,usort會引發錯誤。你應該以某種方式檢查。

+0

謝謝,這是有道理的。由於這是一個側面項目,我以後不能再檢查。會讓你知道,但你說的話是有道理的(可能是對的)。 –