【发布时间】:2010-03-03 12:31:01
【问题描述】:
我想使用 PHP 列出 FTP 服务器上的所有文件。根据RFC 959,FTP 命令LIST 允许在文件/文件夹上打印任意人类可读信息,这似乎使得无法正确确定文件类型。但是其他 FTP 客户端如何区分文件和文件夹呢?有没有不成文的标准之类的?
【问题讨论】:
我想使用 PHP 列出 FTP 服务器上的所有文件。根据RFC 959,FTP 命令LIST 允许在文件/文件夹上打印任意人类可读信息,这似乎使得无法正确确定文件类型。但是其他 FTP 客户端如何区分文件和文件夹呢?有没有不成文的标准之类的?
【问题讨论】:
我终于找到了实现所需行为的 FTP 协议的扩展:该命令称为 MLSD,可以在 page 23 of RFC 3659 上找到。我将使用它作为默认值,并尝试解析LIST 的输出,就好像它是由ls -l 作为后备返回的一样。
【讨论】:
我认为很大程度上取决于 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 是一个文件。
【讨论】:
您可以使用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 中没有提及这个“标准”?
为什么不在文件/路径上添加CD?如果发生错误,它就是一个文件。
【讨论】: