[英]FTP directory partial listing with wildcards
首先我問: ftp目錄列表超時。 大量子目錄。 我得到了答案。
仍然因為我可以在目錄中有數十萬個 FTP 對象,所以掃描它可能需要很長時間。 但是我認為有可能檢索以“A”開頭的所有對象,然后是“B”等等......當它檢索目錄時,它可以開始在另一個線程上處理它們,而無需等到它獲得整個列表.
是否可以使用標准FtpWebRequest
使用通配符列出 FTP 目錄?
FTP 規范 (RFC 3659) 的最新更新明確禁止這樣做。 從該規范的第 2.2.2 節,標題為“通配符” (強調我的):
對於本規范中定義的命令,所有路徑名都應按字面意思處理。 也就是說,對於作為命令參數給出的路徑名,其名稱與給定路徑名相同的文件是隱含的。 路徑名中的任何字符都不能被視為特殊或“魔法”,因此在給定的路徑名和服務器 FTP 的 NVFS 中存在的文件之間不允許進行模式匹配(除了完全相等)。
需要某種形式的模式匹配功能的客戶必須獲得一個或多個相關目錄的列表,並實現他們自己的文件名選擇過程。
也就是說,如果您的服務器支持它,您仍然可以使用FtpWebRequest
類,但您必須自己處理響應以處理項目列表,因為 .NET 類不會理解您的服務器特定擴展。
FTP 規范說文件列表命令( LIST
、 NLIST
、 MLSD
等)的參數是一個路徑名。 所以無論如何都不應該有通配符。
RFC 959 ( LIST
+ NLIST
):
2.2. 術語
...
pathname
路徑名被定義為必須由用戶輸入文件系統以識別文件的字符串。 路徑名通常包含設備和/或目錄名稱,以及文件名規范。 FTP 尚未指定標准路徑名約定。 每個用戶都必須遵循傳輸中涉及的文件系統的文件命名約定。
...
5.3.1. FTP 命令
...
LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>
RFC 3659 ( MLSD
):
2.2.2. 通配符
對於本規范中定義的命令,所有路徑名都應按字面意思處理。 也就是說,對於作為命令參數給出的路徑名,其名稱與給定路徑名相同的文件是隱含的。 路徑名中的任何字符都不能被視為特殊或“魔法”,因此在給定的路徑名和服務器 FTP 的 NVFS 中存在的文件之間不允許進行模式匹配(除了完全相等)。
...
7.1. MLSx 請求的格式
...
MLSx 命令的語法是:
mlst = "MLst" [ SP pathname ] CRLF mlsd = "MLsD" [ SP pathname ] CRLF
實際上,盡管許多 FTP 服務器確實支持參數中的通配符。 但是由於規范不允許這樣做,顯然沒有支持通配符的固定標准。
vsftpd支持*
, ?
和{}
與LIST
。 vsftpd 不支持現代MLSD
。
proftpd支持*
, ?
和[]
。 但僅適用於LIST
。 它明確不允許使用帶有注釋的現代MLSD
通配符:
RFC3659 明確不支持 glob 字符。 所以警告這一點,但讓命令按原樣繼續。
pureftpd支持*
, ?
和[]
用於LIST
和MLSD
。
FileZilla的服務器支持*
只針對這兩個LIST
和MLSD
。
但總的來說,您根本不應該依賴 FTP 服務器來支持任何通配符。
唯一可靠的方法是檢索完整的目錄列表並在本地過濾文件。 例如,您可以使用正則表達式( Regex
類)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.