【发布时间】:2017-06-21 03:52:06
【问题描述】:
我想用ftp_nlist函数获取FTP文件夹中的所有文件。
但默认情况下它返回一个按名称排序的数组。
我想按上次修改时间对它们进行排序。我尝试在文件夹路径前添加-lt,但它只是在每个文件名前添加日期时间。
请帮帮我!
【问题讨论】:
-
我打赌你将不得不使用:php.net/manual/en/function.ftp-rawlist.php 并手动对其进行解析和排序。
我想用ftp_nlist函数获取FTP文件夹中的所有文件。
但默认情况下它返回一个按名称排序的数组。
我想按上次修改时间对它们进行排序。我尝试在文件夹路径前添加-lt,但它只是在每个文件名前添加日期时间。
请帮帮我!
【问题讨论】:
没有标准的方法可以让 FTP 服务器根据您的(或任何)标准对文件进行排序。
虽然一些 FTP 服务器,尤其是 ProFTPD 和 vsftpd,支持使用 LIST/NLST 命令对条目进行排序的专有标志。
这两个服务器都支持-t 标志以按修改时间对文件进行排序:
LIST -t
虽然这不仅不规范,但实际上违反了 FTP 协议。
有关 ProFTPD 支持的所有选项,请参见其手册页:
http://www.proftpd.org/docs/directives/linked/config_ref_ListOptions.html
请注意,vsftpd 仅支持-a、-r、-t、-F 和-l,含义与 ProFTPD 相同。
如果您的服务器不支持-t 开关(或类似开关),您唯一的选择是按原样检索具有文件属性的列表并在本地对其进行排序。
为此,您不能使用ftp_nlist,因为它只返回文件名。
理想的解决方案是使用返回可靠的机器可读目录列表的MLSD FTP 命令。但是 PHP 仅从 7.2 开始支持它的ftp_mlsd function。检查"modify" 条目。
或者,ftp_rawlist 命令的用户 cmets 中有 MLSD 的实现:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071
在采用这种方法之前,首先检查您的 FTP 服务器是否支持 MLSD,因为并非所有 FTP 服务器都支持(尤其是 IIS and vsftpd don't)。
或者,您可以使用ftp_rawlist。尽管它返回文件的专有列表,但可能难以解析。但是如果您只需要支持一个特定的服务器,您可以硬编码该服务器的解析。
【讨论】: