【问题标题】:Get directory structure from FTP using PHP使用 PHP 从 FTP 获取目录结构
【发布时间】:2021-01-20 04:19:24
【问题描述】:

我有一个 ftp 服务器,里面有很多子文件夹和文件。我需要从 ftp 中检索文件夹结构,它显示了来自指定起始路径的所有文件夹和子文件夹的名称。我对每个文件夹中包含的文件不感兴趣,只对目录树感兴趣。我正在使用 PHP,但我的服务器不支持 mlsd。

感谢您的帮助。

我实现了自己的递归函数,但由于某种原因它不起作用。

function ftp_list_files_recursive($ftp_stream, $path) {
    $lines = ftp_rawlist($ftp_stream, $path);
    $result = [];
    if (is_array($lines) || is_object($lines)) {
        foreach ($lines as $line) {
            $exp0 = explode('<', $line);
            if (sizeof($exp0) > 1):
                $exp1 = explode('>', $exp0[1]);
                if ($exp1[0] == 'DIR') {
                    $file_path=$path . "/" . ltrim($exp1[1]);
                    $result = array_merge($result, ftp_list_files_recursive($ftp_stream, $file_path));
                } else {
                    $result[] = $file_path;
                }
            endif;
        }
    }

    return $result;
}

ftp_rawlist 返回目录信息为:01-18-20 01:00PM &lt;DIR&gt; DirName 所以首先我在&lt; 上爆炸并检查它是否成功。如果是,则表示其中包含DIR 的字符串,并且可以在&gt; 上进一步分解。它可以用正则表达式完成,但现在对我有用。如果我打印 $file_path 变量,我会看到它发生了变化,所以我假设递归有效。但是,$result 数组始终为空。对此有什么想法吗?

【问题讨论】:

    标签: php ftp directory-listing directory-tree


    【解决方案1】:

    从这里开始:PHP FTP recursive directory listing

    您只需将代码调整为:

    1. 您从 FTP 服务器(可能是 IIS)获得的 DOS 样式列表和
    2. 只收集文件夹。
    function ftp_list_dirs_recursive($ftp_stream, $directory)
    {
        $result = [];
    
        $lines = ftp_rawlist($ftp_stream, $directory);
        if ($lines === false)
        {
            die("Cannot list $directory");
        }
    
        foreach ($lines as $line)
        {
            // rather lame parsing as a quick example:
            if (strpos($line, "<DIR>") !== false)
            {
                $dir_path = $directory . "/" . ltrim(substr($line, strpos($line, ">") + 1));
                $subdirs = ftp_list_dirs_recursive($ftp_stream, $dir_path);
                $result = array_merge($result, [$dir_path], $subdirs);
            }
        }
        return $result;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多