0

我在我的 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)

任何帮助表示赞赏。

4

2 回答 2

1

FTP 规范说文件列表命令( , 等)的参数LISTMLSD路径名。所以无论如何都不应该有通配符。


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

vsftpd支持*,?和. {}_ LISTvsftpd 不支持现代MLSD.

Proftpd支持*,?[]. 但LIST只为。它明确不允许带有现代MLSD注释的通配符:

RFC3659 明确不支持全局字符。所以警告这一点,但让命令按原样继续。

pureftpd支持*,?和和. []_LISTMLSD


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

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

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

于 2015-01-28T07:30:58.700 回答
1

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

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

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

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

您应该查看远程 FTP 服务器的文档,或与远程系统的管理员交谈,以了解您应该如何请求您正在寻找的文件列表。

于 2015-01-27T21:43:45.467 回答