我在我的java代码中使用FTP(com.jscape.inet.ftp.Ftp)来获取文件列表。我使用以下一段代码来获取文件列表。
Enumeration<String> files= ftp.getNameListing("test*");
上面的代码列出了所有带有 test* 名称的文件。
但是,我在列出所有以 A 或 B 结尾的测试文件时遇到问题。我尝试了以下模式来获取列表。
Enumeration<String> files= ftp.getNameListing("test*[A-B]");
Enumeration<String> files= ftp.getNameListing("test*[AB]");
但是它们都不起作用,我收到了例外
501 Qualifier too long. Use MVS naming conventions.
com.jscape.inet.ftp.FtpException: Unable to connect to host **.**.**.**
at com.jscape.inet.ftp.FtpBaseImplementation.openDataConnection(Unknown Source)
at com.jscape.inet.ftp.FtpBaseImplementation.getNameListing(Unknown Source)
at com.jscape.inet.ftp.Ftp.getNameListing(Unknown Source)
任何帮助,不胜感激。
FTP规范说文件列表命令(LIST
,MLSD
等)的参数是路径名。所以不应该有通配符,无论如何。
实际上,尽管许多FTP服务器确实在参数中支持wilcards。但由于规范不允许这样做,因此支持的通配符显然没有设定标准。
VSFTPD 支持*
、?
和{}
与LIST
。 VSFTPD 不支持现代MLSD
。
Proftpd 支持 *
、?
和 []
。但仅供LIST
。它明确不允许带有注释的现代MLSD
的 wilcards:
RFC3659明确不支持 glob 字符。 所以警告 这,但让命令按原样继续。
PuretfDP支持LIST
和MLSD
的*
、?
和[]
。
但是您没有使用上述任何FTP服务器,而是使用一些IBM服务器。我不知道它支持什么样的通配符(如果有的话)。
但一般来说,您根本不应该依赖 FTP 服务器来支持任何通配符。
唯一可靠的方法是检索完整的目录列表并在本地过滤文件。
您连接到的 FTP 服务器不接受您指定的文件名通配符。FTP 文件列表命令的定义不是很好。以下是 RFC 959 对协议命令的描述:
列表(列表)
此命令会导致列表从服务器发送到被动桌面排版。 如果路径名指定了目录或其他文件组,服务器应传输文件列表在指定的目录中。 如果路径名指定了文件,然后服务器应发送当前信息文件。 空参数表示用户当前的工作或默认目录。 数据传输通过数据进行ASCII 或 EBCDIC 类型的连接。 (用户必须确保 TYPE 是适当的 ASCII 或 EBCDIC)。由于文件上的信息可能因系统而异对于系统,此信息可能难以自动使用在程序中,但可能对人类用户非常有用。
名称列表 (NLST)
此命令会导致从 发送目录列表服务器到用户站点。 路径名应指定目录或其他系统特定的文件组描述符;一个null 参数表示当前目录。 服务器将返回文件名流,而不是其他信息。 数据将以 ASCII 或数据连接上的 EBCDIC 类型作为有效路径名由 或 分隔的字符串。 (同样,用户必须确保类型正确。 此命令适用于返回程序可以使用的信息进一步自动处理文件。 例如,在"多获取"函数的实现。
您会注意到完全没有讨论客户端可以发送哪些通配符或服务器将如何解释它们。那是因为该领域根本没有标准。Unix ftp 服务器通常实现文件列表,如带有类似 unix 的通配符的 unix ls
命令,但这绝不是必需的行为,
您应该查看远程 FTP 服务器的文档,或与远程系统的管理员联系,以了解您应该如何请求您要查找的文件列表。