带有通配符的FTP目录部分列表
首先我问: ftp目录列表超时。 大量的子目录 。 我得到了答案。
仍然因为我可以在目录中拥有数十万个FTP对象,所以扫描它可能需要很长时间。 但是我认为有可能检索所有以’A’开头然后’B’的对象等等……当它检索目录时,它可以开始在另一个线程上处理它们,而不必等到它获得整个列表。
是否可以使用标准FtpWebRequest
使用通配符进行FTP目录列表?
FTP规范(RFC 3659)的最新更新明确禁止它。 从该规范的2.2.2节,标题为“Wildcarding” (强调我的):
对于本规范中定义的命令,所有路径名都应按字面处理。 也就是说,对于作为命令参数给出的路径名,隐含了名称与给定路径名相同的文件。 路径名中的任何字符都不能被视为特殊字符或“魔术”,因此不允许在给定的路径名与服务器FTP的NVFS中存在的文件之间进行模式匹配(除了精确相等)。
需要某种forms的模式匹配function的客户端必须获取相关目录或目录的列表,并实现它们自己的文件名选择过程。
也就是说,如果您的服务器支持它,您仍然可以使用FtpWebRequest
类 ,但您必须自己处理响应以处理项目列表,因为.NET类将无法理解您的服务器特定扩展。
FTP规范说文件列表命令( LIST
, NLIST
, MLSD
等)的参数是路径名。 所以应该没有任何通配符。
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支持*
, ?
和[]
用于LIST
和MLSD
。
FileZilla服务器仅支持*
LIST
和MLSD
。
但总的来说,您不应该依赖FTP服务器来支持任何通配符。
唯一可靠的方法是检索完整的目录列表并在本地过滤文件。 例如,您可以使用正则表达式( Regex
类 )