PHP FTP 递归目录列表
P粉621033928
P粉621033928 2023-08-25 00:36:20
[PHP讨论组]

我正在尝试创建一个递归函数来从数组中的 ftp 服务器获取所有目录和子目录。

我尝试了很多在网上找到的功能。最适合我的是这个:

public function getAllSubDirFiles() {
    $dir = array(".");
    $a = count($dir);
    $i = 0;
    $depth = 20;
    $b = 0;
    while (($a != $b) && ($i < $depth)) {
        $i++;
        $a = count($dir);
        foreach ($dir as $d) {
            $ftp_dir = $d . "/";
            $newdir = ftp_nlist($this->connectionId, $ftp_dir);
            foreach ($newdir as $key => $x) {

                if ((strpos($x, ".")) || (strpos($x, ".") === 0)) {
                    unset($newdir[$key]);
                } elseif (!in_array($x, $dir)) {
                    $dir[] = $x;
                }
            }
        }
        $b = count($dir);
    }
    return $dir ;

}

这个函数的问题是它不允许目录有“.”。在它的名称中,位于根目录中的每个文件也将被视为一个目录。所以我调整了函数并得到了这个:

public function getAllSubDirFiles($ip, $id, $pw) {
    $dir = array(".");
    $a = count($dir);
    $i = 0;
    $depth = 20;
    $b =0;
    while (($a != $b) && ($i < $depth)) {
        $i++;
        $a = count($dir);
        foreach ($dir as $d) {
            $ftp_dir = $d . "/";
            $newdir = ftp_nlist($this->connectionId, $ftp_dir);
            foreach ($newdir as $key => $x) {
                if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) {
                    unset($newdir[$key]);
                } elseif (!in_array($x, $dir)) {
                    $dir[] = $x;
                }
            }
        }
        $b = count($dir);
    }
    return $dir ;

}

这工作得很好,但给出了我想要的结果。但它太慢了,无法使用。

我也尝试过使用ftp_rawlist,但它也有同样的缺点,那就是速度非常慢。

public function getAllSubDirFiles() {
    $dir = array(".");
    $a = count($dir);
    $i = 0;
    $depth = 20;
    $b = 0;
    while (($a != $b) && ($i < $depth)) {
        $i++;
        $a = count($dir);
        foreach ($dir as $d) {
            $ftp_dir = $d . "/";
            $newdir = $this->getFtp_rawlist('/' . $ftp_dir);
            foreach ($newdir as $key => $x) {

                $firstChar = substr($newdir[$key][0], 0, 1);

                $a = 8;
                    while ($a < count($newdir[$key])) {

                        if ($a == 8) {
                            $fileName = $ftp_dir . '/' . $newdir[$key][$a];
                        } else {
                            $fileName = $fileName . ' ' . $newdir[$key][$a];
                        }
                        $a++;
                    }

                if ($firstChar != 'd') {
                    unset($newdir[$key]);
                } elseif (!in_array($fileName, $dir)) {

                    $dir[] = $fileName;
                }
            }
        }
        $b = count($dir);
    }
    return $dir;
}

public function getFtp_rawlist($dir) {

    $newArr = array();

    $arr = ftp_rawlist($this->connectionId, $dir);

    foreach ($arr as $value) {

        $stringArr = explode(" ", $value);

        $newArr[] = array_values(array_filter($stringArr));
    }
    return $newArr;
}

过去几天我一直被这个问题困扰,我越来越绝望了。如果有人有任何建议请告诉我

P粉621033928
P粉621033928

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号