使用PHP检查FTP条目是文件还是文件夹

问题描述 投票:4回答:2

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

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

有没有其他方法来检查我的项目是文件还是文件夹?

php ftp
2个回答
3
投票

尝试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告诉你,如果条目是一个目录。


您可能很幸运,在您的具体情况下,您可以通过文件名告诉目录中的文件(即所有文件都有扩展名,而子目录则没有)。


0
投票

如果有人在2018年以上需要这个

你可以使用ftp_nlist。对于文件,您将检索仅包含一个元素的数组(文件路径本身),对于目录,您将在数组...中至少包含两个项目,如果不存在任何文件或目录,则会返回一个空数组。

© www.soinside.com 2019 - 2024. All rights reserved.