我正在编写一个用于连接FTP的脚本,然后下载内容。
现在我的问题是检测每个项目是文件夹还是文件。我的第一个想法是尝试使用ftp_chdir
,但这需要我使用@
来抑制错误,我不希望这样做(我不希望抑制错误,而是更愿意正确处理它们)。
有没有其他方法来检查我的项目是文件还是文件夹?
尝试ftp_chdir
的坏处不是要压制错误。没关系,只要你有合理的理由期待错误。这更改了目录的副作用。
如果我采取这个方向,我会尝试使用ftp_size
,因为它没有任何副作用。它应该失败的目录和成功的文件。
理想的解决方案是使用MLSD
FTP命令返回可靠的机器可读目录列表。但PHP仅支持7.2以及ftp_mlsd
function。查看"type"
条目以获取dir
值。
或者,在MLSD
命令的用户注释中有ftp_rawlist
的实现:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071
在采用这种方法之前,首先检查您的FTP服务器是否支持MLSD
,因为并非所有FTP服务器都这样做(特别是IIS and vsftpd don't)。
或者,如果要连接到一个特定的服务器,因此您知道其目录列表的格式,您可以使用ftp_rawlist
,并解析其输出以确定条目是文件还是文件夹。
* nix服务器上的典型列表如下:
drwxr-x--- 3 vincent vincent 4096 Jul 12 12:16 public_ftp
drwxr-x--- 15 vincent vincent 4096 Nov 3 21:31 public_html
-rwxrwxrwx 1 vincent vincent 11 Jul 12 12:16 file.txt
它是领先的d
告诉你,如果条目是一个目录。
您可能很幸运,在您的具体情况下,您可以通过文件名告诉目录中的文件(即所有文件都有扩展名,而子目录则没有)。
如果有人在2018年以上需要这个
你可以使用ftp_nlist。对于文件,您将检索仅包含一个元素的数组(文件路径本身),对于目录,您将在数组.
和..
中至少包含两个项目,如果不存在任何文件或目录,则会返回一个空数组。