1

指定されたパスのコンテンツをクロールし、親フォルダーまたはサブフォルダーで見つかった .htm または .html ページをインデックス化する大規模なプログラムの一部として、次の関数を使用しています。私のクローラー機能(以下)は再帰的であり、アイテムを含まないサブフォルダーに到達するまで問題なく動作しているようです。

これは、while ループを次のように構成することで解決されることが多い一般的な問題のようです。

while ( false !== ($file = readdir($folder)) )

しかし、これは機能していません。出力を取得する最後の行は「現在のクローラー パスは ...」であり、その後出力が停止します。問題は空のフォルダーとreaddir機能だと思いますが、修正方法がわかりません。誰かが提案を提供できますか?

ありがとう

function crawlFolders($path)
{
    $prevPath = $path;  // variable to keep track of the previous file path
    chdir($path);
    $folder = opendir($path);

    echo "The current crawler path is ".$path."<br>";

    while ( false !== ($file = readdir($folder)) ) // read current directory item, then advance pointer
    {   
        if ( is_file($file) )
        {   echo "File found!  The crawler is inspecting to see if it can be indexed<br>";
            if ( canIndex($path."/".$file) )
                indexPage($path."/".$file);
        }

        else if ( is_dir($file) ) 
        {
            //it's a folder, we must crawl
            if ( ($file != ".") && ($file != "..") )    //it's a folder, we must crawl
            {
                echo "$file is a folder<br><br>";
                crawlFolders($path."/".$file);
                chdir($prevPath); // change the working dir back to that of the calling fn

            }
        }   
    }
    closedir($folder);

}

これをもう少し見てみると、readdir が問題を引き起こしている理由がわかりません。問題は、私のcrawlFolders関数が巻き戻されておらず、代わりに最も深い空のフォルダーに到達したときに終了していることにあると思います. 再帰が機能する方法で何か不足していますか? while ループが false を返すと、再帰的な関数呼び出しが終了し、再帰的な呼び出しを行った前のcrawlFolders 関数 (つまり、巻き戻し自体) に落ちるという印象を受けました。

呼び出し元の関数が再開する場所を認識できるように、crawlFolders が終了するたびに値を返す必要がありますか?

再帰が問題であるように思われます。空のフォルダーにファイルを配置すると、インデクサーが機能しましたが、関数はまだ期待どおりにアンワインドしませんでした。評価されていない開始パスにまだ 2 つのファイルがあるため、これが発生していないことはわかっています。

4

1 に答える 1

1

問題は再帰ではなく、現在の作業ディレクトリである可能性が非常に高いです。

chdir()とを使用して現在のディレクトリを変更し、と$fileに相対ファイル名を指定is_file()is_dir()ます。実行が再帰から戻った後、現在のディレクトリはまだサブディレクトリであるためis_file($file)is_dir($file)ファイルが見つかりません。

再帰に入る前に現在のディレクトリを保存する必要があります。または、chdir()完全に回避してフルパスで作業することをお勧めします。is_file($path . '/' . $file)

于 2012-10-14T15:31:31.703 に答える