0

我的两个类“文件”和“文件夹”中的一段代码有一些问题。我创建了一个页面,向我展示了我的服务器空间的内容。因此,我编写了类文件夹,其中包含有关它自己的信息,例如“名称”、“路径”和“孩子”。children 属性包含此文件夹中的“文件”或“文件夹”数组。所以它是一种递归类。为了获得所需目录的整个结构,我编写了一些递归回溯算法,这些算法为我提供了一个对象数组,用于与服务器上的文件夹结构相同的所有子对象。第二种算法采用该数组并搜索一个特殊文件夹。如果找到此文件夹,该方法将返回它的根路径,如果该文件夹不是 此目录的 ta 子文件夹,算法将返回 false。我已经为“文件夹”对象测试了所有这些方法,它工作得很好,但现在我通过更密集地使用我的脚本检测到一个错误。

/**
 * 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.'/');
            }
        }   
    }
}

在我的网站中,我首先创建了一个新的文件夹对象,然后我开始找到一个名为“test”的“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' 我尝试调试了一下,发现包含所有子项的文件夹列表保留具有正确链接的对象,但在第一个条件中的 findFolder 方法中,如果对象$this没有正确的路径。我不知道为什么,但是

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

似乎改变了对象的属性。我希望有人可以帮助我并提前致谢

4

1 回答 1

0

Don't reinvent the wheel. PHP already has a class for that purpose named RecursiveDirectoryIterator.

http://php.net/manual/en/class.recursivedirectoryiterator.php

于 2013-09-08T20:40:52.167 回答