2011-07-13 6 views
0

私は次の関数を使用して、指定されたフォルダ内のファイルとディレクトリを列挙します。サブフォルダを実行するとうまく動作しますが、何らかの理由で親ディレクトリで作業したくありません。なぜどんなアイデア?私はそれがPHPの設定や何かであるかもしれないと思いますが、どこから始めるべきかわかりません。そうであれば、これは安価な共有ホスティング設定で実行されるので、私は運が不足しています。親ディレクトリのファイルを列挙してください

この機能の使い方は次のとおりです。最初のパラメータは列挙するパスで、2番目のパラメータは無視するフィルタのリストです。私は以下のように完全なパスを通過しようとしました。私はちょうど.../..realpath('..')を渡そうとしました。何も動作していないようです。私は関数が何とか何とか失敗しているわけではないことを知っています。 dirs配列に手動でディレクトリを追加すると、値が返されます。

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

ここでは、opendir関数とdirを混合している関数自体

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

です。 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); 

注:$ファイルまたは$ dirsには、whileループの後に設定されていない可能性があります。 (ファイルやディレクトリがないかもしれません)。その場合、usortはエラーを投げます。それを何らかの方法でチェックする必要があります。

+0

ありがとうございます。これはサイドプロジェクトなので、後で確認することはできません。あなたに知らせてくれるだろうが、あなたが言っていることは意味がある(そしておそらく正しい)。 –

関連する問題