检查 FTP 条目是否为带有 PHP 的文件或文件夹

Check if FTP entry is file or folder with PHP

我正在编写用于连接到 FTP 然后下载内容的脚本。

现在我的问题是检测每个项目是文件夹还是文件。 我的第一个想法是尝试使用 ftp_chdir,但这需要我使用 @ 来抑制错误,而我不想这样做(我不想抑制错误,但是相反更喜欢正确处理它们)。

还有其他方法可以检查我的项目是文件还是文件夹吗?

尝试 ftp_chdir 的坏处不是需要抑制错误。没关系,只要您有合理的理由预计会出现错误。这是更改目录的副作用。

如果我选择那个方向,我会尝试 ftp_size,因为它没有任何副作用。目录应该失败,文件应该成功。


理想的解决方案是使用 MLSD FTP 命令,即 returns 可靠的机器可读目录列表。但是 PHP 仅从 7.2 开始支持 ftp_mlsd function。检查 "type" 条目中的 dir 值。

或者,在 ftp_rawlist 命令的用户评论中有一个 MLSD 的实现:
https://www.php.net/manual/en/function.ftp-rawlist.php#101071

在采用这种方法之前,首先检查您的 FTP 服务器是否支持 MLSD,因为并非所有 FTP 服务器都支持(尤其是 )。


或者,如果您连接到一个特定的服务器,那么您知道其目录列表的格式,您可以使用 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。 对于文件,您将检索只有一个元素(文件路径本身)的数组,对于目录,您将在数组 ... 中至少有两个项目,如果那里不存在文件或目录将返回一个空数组。