带有通配符的FTP目录部分列表

首先我问: ftp目录列表超时。 大量的子目录 。 我得到了答案。

仍然因为我可以在目录中拥有数十万个FTP对象,所以扫描它可能需要很长时间。 但是我认为有可能检索所有以’A’开头然后’B’的对象等等……当它检索目录时,它可以开始在另一个线程上处理它们,而不必等到它获得整个列表。

是否可以使用标准FtpWebRequest使用通配符进行FTP目录列表?

FTP规范(RFC 3659)的最新更新明确禁止它。 从该规范的2.2.2节,标题为“Wildcarding” (强调我的):

对于本规范中定义的命令,所有路径名都应按字面处理。 也就是说,对于作为命令参数给出的路径名,隐含了名称与给定路径名相同的文件。 路径名中的任何字符都不能被视为特殊字符或“魔术”,因此不允许在给定的路径名​​与服务器FTP的NVFS中存在的文件之间进行模式匹配(除了精确相等)。

需要某种forms的模式匹配function的客户端必须获取相关目录或目录的列表,并实现它们自己的文件名选择过程。

也就是说,如果您的服务器支持它,您仍然可以使用FtpWebRequest类 ,但您必须自己处理响应以处理项目列表,因为.NET类将无法理解您的服务器特定扩展。

FTP规范说文件列表命令( LISTNLISTMLSD等)的参数是路径名。 所以应该没有任何通配符。

RFC 959 ( LIST + NLIST ):

2.2。 术语

pathname

路径名被定义为必须由用户输入到文件系统以识别文件的字符串。 路径名通常包含设备和/或目录名称以及文件名规范。 FTP尚未指定标准路径名约定。 每个用户必须遵循传输中涉及的文件系统的文件命名约定。

5.3.1。 FTP命令

LIST [ ]
NLST [ ]

RFC 3659 ( MLSD ):

2.2.2。 通配符

对于本规范中定义的命令,所有路径名都应按字面处理。 也就是说,对于作为命令参数给出的路径名,隐含了名称与给定路径名相同的文件。 路径名中的任何字符都不能被视为特殊字符或“魔术”,因此不允许在给定的路径名​​与服务器FTP的NVFS中存在的文件之间进行模式匹配(除了精确相等)。

7.1。 MLSx请求的格式

MLSx命令的语法是:

 mlst = "MLst" [ SP pathname ] CRLF mlsd = "MLsD" [ SP pathname ] CRLF 

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

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

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

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

pureftpd支持* , ?[]用于LISTMLSD

FileZilla服务器仅支持* LISTMLSD


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

唯一可靠的方法是检索完整的目录列表并在本地过滤文件。 例如,您可以使用正则表达式( Regex类 )