2012-01-13 9 views
2

リモートPCのディレクトリの内容をインデックスする必要があるWindows XP SP3で動作するPHP 5.3.4アプリケーションがあります。私が索引付けしている最大のディレクトリには約18,000の項目が含まれています。特定の項目を含むディレクトリを見つける最速の方法

この呼び出しでは、\\somepc.mycorp.com\foo\mydir\bar\zoo.zipのような項目が検索されます。

// look in all the directories in \\somepc.mycorp.com\foo for directories containing a file \bar\zoo.zip 
$item_list = GetFileList('\\\\somepc.mycorp.com\\foo', '\\bar\\zoo.zip'); 

それは次のように実装されています。残念ながら

function GetFileList($base_dir, $path_mask) 
{ 
    $result= array(); 
    if ($handle = opendir($base_dir)) 
    { 
     while (false !== ($entry = readdir($handle))) 
     { 
      // only add items that match the mask we're looking for 
      if ($entry != "." && 
       $entry != ".." && 
       file_exists($base_dir.'\\$entry\\$path_mask')) 
      { 
       array_push($result, $entry); 
      } 
     } 

     closedir($handle); 
    } 
    return $result; 
} 

、最大のディレクトリ構造のため、この操作は時間を引き継ぐことができます。フィルタを削除して、配列に表示されているすべての項目を挿入すると、数秒で終了します。

これを行う方法はありますか?

+0

とリモートPCのOSは何ですか? –

+0

@Ivan - Windowsファイル共有。 (OSはおそらくいくつかのWindowsサーバーの亜種です。私は確かではありません...おそらく2003年のサーバー) – PaulH

答えて

3

私はこのカードを引っ張ってはいけませんが、bashやWindowsスクリプティングを使っていても、はるかに速く完了することができます.PHPはおそらくこの仕事のための正しいツールではありません。システムコール(PHP内からでも)をdir /s /bまたはfindにすると、存在するすべてのファイルの一覧が表示され、PHPを使用してこれらの文字列をすべてのディレクトリにファイルが存在するかどうかを確認するよりもはるかに高速に処理できます。

(私は怠け者だと適切な検索構文を知らないので)私はこのようなbashでこれを行うだろう:

find | grep '/bar/zoo.zip' 

を、私は適切なWindowsのシェルコマンドを知らない(私が持っているので、私のマシンにWinGnu32 grepがインストールされているので)、私はそこにお手伝いできません。

編集:私は周りfudgingのビットを行なったし、上記のコマンドのWindowsの同等物を見つけ

dir /s /b | find "/bar/zoo.zip" 
関連する問題