0

'File' と 'Folder' の 2 つのクラスのコードに問題があります。サーバー スペースのコンテンツを表示するページを作成しました。したがって、「名前」、「パス」、「子供」などの情報を含むクラスフォルダーを作成しました。children プロパティには、このフォルダ内の「ファイル」または「フォルダ」の配列が含まれています。つまり、一種の再帰クラスです。必要なディレクトリの構造全体を取得するために、サーバー上のフォルダーと同じ構造にあるすべての子のオブジェクトの配列を提供する再帰的なバックトラッキング アルゴリズムを作成しました。2 番目のアルゴリズムはその配列を取得し、特別なフォルダーを検索します。このフォルダーが見つかった場合、メソッドはそのフォルダーへのルート パスを返します。このディレクトリのサブフォルダーにアクセスすると、アルゴリズムは false を返します。「Folder」オブジェクトに対してそのすべてのメソッドをテストしたところ、問題なく動作しましたが、スクリプトをより集中的に使用するとエラーが検出されました。

/**
 * find an subfolder within the given directory (Recursive)
 */
public function findFolder($name) {

    // is this object the object you wanted
    if ($this->name == $name) {
        return $this->getPath();
    }

    // getting array
    $this->bindChildren();
    $result = $this->getChildren();

    // backtracking part
    foreach($result as $r) {
        // skip all 'Files'
        if(get_class($r) == 'File') {
            continue;   
        } else {
            if($search_res = $r->findFolder($name)) {
                return $search_res;
            }
        }
    }

    // loop runned out
    return false;

}

/**
 * stores all children of this folder
 */
public function bindChildren() {
    $this->resetContent();
    $this->dirSearch();
}

/**
 * resets children array
 */
private function resetContent() {
    $this->children = array();
}

/**
 * storing children of this folder
 */
private function dirSearch() {
    $dh = opendir($this->path);

    while($file = readdir($dh)) {
        if($file !== "" && $file !== "." && $file !== "..") {
            if(!is_dir($this->path.$file)) {
                $this->children[] = new File($this->path.$file);
            } else {
                $this->children[] = new Folder($this->path.$file.'/');
            }
        }   
    }
}

私のWebサイトでは、最初に新しいフォルダーオブジェクトを作成し、次に「テスト」などと呼ばれる「doc」のサブフォルダーを見つけ始めています。「test」フォルダは「/var/www/media/username/doc/test4/test/」にあります

$folder = new Folder('/var/www/media/username/doc/');
$dir = $folder->findFolder('test');

印刷する$dirと、「test」フォルダーは「docs」のサブフォルダーであるため、必要なリンクが返されますが、返されるリンクは正しくありません。'/var/www/media/username/doc/test4/test' のはずですが、結果は '/var/www/media/username/doc/test' です。ちょっとデバッグしてみたところ、すべての子を含むフォルダーリストは、オブジェクトを正しいリンクで保持していますが、最初の if 条件の findFolder メソッドでは、オブジェクト$thisに正しいパスがありません。理由はわかりませんが、

// backtracking part
foreach($result as $r) {

オブジェクトのプロパティを変更するようです。誰かが私を助けてくれることを願っています。

4

1 に答える 1