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

Get File Listing ending with A or B using Jscape FTP

我在 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]");

但是 none 他们正在工作,我收到一个异常

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 服务器不接受您指定的文件名通配符。 FTP 文件列表命令的定义不是很明确。以下是 RFC 959 对协议命令的描述:

LIST (LIST)
This command causes a list to be sent from the server to the passive DTP. If the pathname specifies a directory or other group of files, the server should transfer a list of files in the specified directory. If the pathname specifies a file then the server should send current information on the file. A null argument implies the user's current working or default directory. The data transfer is over the data connection in type ASCII or type EBCDIC. (The user must ensure that the TYPE is appropriately ASCII or EBCDIC). Since the information on a file may vary widely from system to system, this information may be hard to use automatically in a program, but may be quite useful to a human user.

名单 (NLST)
此命令导致目录列表从 服务器到用户站点。路径名应指定一个 目录或其他系统特定的文件组描述符;一种 null 参数表示当前目录。服务器 将 return 文件名流,没有其他 信息。数据将以 ASCII 或 数据连接上的 EBCDIC 类型作为有效路径名 由 或 分隔的字符串。 (再次用户必须 确保 TYPE 正确。)此命令旨在 return 程序可以使用的信息 进一步自动处理文件。例如,在 “多次获取”功能的实现。

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

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

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


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

vsftpd 支持 *?{} 以及 LIST。 vsftpd 不支持现代 MLSD.

proftpd 支持 *?[]。但仅限 LIST。它明确不允许使用带有注释的现代 MLSD 的通配符:

RFC3659 explicitly does NOT support glob characters. So warn about this, but let the command continue as is.

pureftpd 支持 *?[] LISTMLSD


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

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

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