使用Jscape FTP获取以A或B结尾的文件列表

我在我的java代码中使用FTP(com.jscape.inet.ftp.Ftp)来获取文件列表。 我使用以下代码来获取文件列表。

Enumeration files= ftp.getNameListing("test*"); 

上面的代码列出了带test * name的所有文件。

但是,我在列出以A或B结尾的所有测试文件时遇到问题。我尝试了以下模式来获取列表。

 Enumeration files= ftp.getNameListing("test*[AB]"); Enumeration 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规范说文件列表命令( LISTMLSD等)的参数是路径名。 所以应该没有任何通配符。


实际上,虽然许多FTP服务器在参数中支持wilcards。 但是由于规范不允许这样做,显然没有支持的通配符的设定标准。

vsftpd支持* , ?{}LIST 。 vsftpd不支持现代MLSD

proftpd支持* , ?[] 。 但仅限于LIST 。 它明确地不允许带有现代MLSD wilcards评论:

RFC3659明确不支持glob字符。 所以警告这个,但让命令继续保持原样。

pureftpd支持* , ?[]用于LISTMLSD


但是您没有使用上述任何FTP服务器,而是使用某些IBM服务器。 我不知道它支持哪种通配符(如果有的话)。

但总的来说,您不应该依赖FTP服务器来支持任何通配符。

唯一可靠的方法是检索完整的目录列表并在本地过滤文件。

您要连接的FTP服务器不接受您指定的文件名通配符。 FTP文件列表命令定义不明确。 以下是RFC 959对协议命令的说明:

列表(列表)
此命令使列表从服务器发送到被动DTP。 如果pathname指定目录或其他文件组,则服务器应传输指定目录中的文件列表。 如果路径名指定文件,则服务器应发送有关该文件的当前信息。 null参数表示用户当前的工作或默认目录。 数据传输通过ASCII类型或EBCDIC类型的数据连接进行。 (用户必须确保TYPE是适当的ASCII或EBCDIC)。 由于文件上的信息可能因系统而异,因此该信息可能难以在程序中自动使用,但对于人类用户可能非常有用。

姓名单(NLST)
此命令导致目录列表从服务器发送到用户站点。 路径名应指定目录或其他特定于系统的文件组描述符; null参数表示当前目录。 服务器将返回文件名称流,而不返回其他信息。 数据将通过数据连接以ASCII或EBCDIC类型传输,作为由或分隔的有效路径名字符串。 (同样,用户必须确保TYPE正确。)此命令旨在返回程序可用于自动进一步处理文件的信息。 例如,在执行“多次获取”function时。

您会注意到完全没有讨论客户端可以发送哪些通配符或服务器如何解释它们。 那是因为那个地区根本就没有标准。 Unix ftp服务器通常使用类似unix的通配符实现类似unix ls命令的文件列表,但这绝不是必需的行为,

您应该检查远程FTP服务器的文档,或者与远程系统的管理员联系,以了解您应该如何询问您正在寻找的文件列表。