【问题标题】:How do I distinguish files and folders on an FTP server如何区分 FTP 服务器上的文件和文件夹
【发布时间】:2010-03-03 12:31:01
【问题描述】:

我想使用 PHP 列出 FTP 服务器上的所有文件。根据RFC 959,FTP 命令LIST 允许在文件/文件夹上打印任意人类可读信息,这似乎使得无法正确确定文件类型。但是其他 FTP 客户端如何区分文件和文件夹呢?有没有不成文的标准之类的?

【问题讨论】:

    标签: php ftp


    【解决方案1】:

    我终于找到了实现所需行为的 FTP 协议的扩展:该命令称为 MLSD,可以在 page 23 of RFC 3659 上找到。我将使用它作为默认值,并尝试解析LIST 的输出,就好像它是由ls -l 作为后备返回的一样。

    【讨论】:

      【解决方案2】:

      我认为很大程度上取决于 ftp 服务器。我大学周围的 ftp 服务器以以下格式向“ls”命令输出:

      drwxr-xr-x    2 5609     1510         1896 Oct 31  2007 practice
      -rw-r--r--    1 5609     1510          646 Feb 08  2009 prgrm1.c
      

      这清楚地表明 practice 是一个目录,而 prgrm1.c 是一个文件。

      【讨论】:

        【解决方案3】:

        您可以使用ftp_rawlist()。获取以“d”开头的项目(表示目录)例如

        $ftp_server="someserver";
        $ftp_user_name="someuser";
        $ftp_user_pass="somepassword";
        $conn_id = ftp_connect($ftp_server);
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
        if ((!$conn_id) || (!$login_result)) {
            echo "FTP connection has failed!";
            echo "Attempted to connect to $ftp_server for user $ftp_user_name";
            exit;
        } else {
            echo "Connected to $ftp_server, for user $ftp_user_name";
            $buff = ftp_rawlist($conn_id, '/');
            $dirs = preg_grep("/^d/",$buff);
            print_r($dirs);
        
        }
        

        【讨论】:

        • 有保证吗?如果它是一个文件夹,服务器是否不能免费打印t 作为第一个字符?还是在 RFC 中没有提及这个“标准”?
        • AFAIK 这个(UNIX ls -l 的输出)是一个“事实上的”标准。
        【解决方案4】:

        为什么不在文件/路径上添加CD?如果发生错误,它就是一个文件。

        【讨论】:

        • ...除非是您无权进入的目录。
        • 那么就按顺序详细检查响应
        最近更新 更多