2012-02-14 18 views
5

Đầu tiên tôi hỏi rằng: ftp directory listing timeout. Huge number of subdirs. Tôi có câu trả lời.Danh sách một phần thư mục FTP với các ký tự đại diện

Tuy nhiên, vì tôi có thể có hàng trăm nghìn đối tượng FTP trong thư mục nên có thể mất nhiều thời gian để quét. Tuy nhiên tôi nghĩ rằng có thể lấy tất cả các đối tượng bắt đầu bằng 'A' và sau đó 'B' và cứ thế ... Khi nó truy xuất các thư mục, nó có thể bắt đầu xử lý chúng trên luồng khác mà không đợi cho đến khi nó nhận được toàn bộ danh sách .

Có thể thực hiện danh sách thư mục FTP bằng ký tự đại diện bằng cách sử dụng tiêu chuẩn FtpWebRequest không?

Trả lời

6

Cập nhật mới nhất cho số FTP specification (RFC 3659) sẽ cấm rõ ràng. Từ section 2.2.2 of that specification, titled "Wildcarding" (tôi nhấn mạnh):

Đối với các lệnh được định nghĩa trong đặc tả này, tất cả các tên đường dẫn là để được đối xử theo nghĩa đen. Tức là, đối với một tên đường dẫn được đưa ra như một tham số cho một lệnh, tệp có tên trùng với tên đường dẫn đã cho là ngụ ý. Không ký tự từ tên đường dẫn có thể được coi là đặc biệt hoặc "kỳ diệu", do đó không phù hợp với mô hình (khác so với bình đẳng chính xác) giữa tên đường dẫn nhất định và các tập tin hiện diện trong NVFS của máy chủ FTP được phép.

Khách hàng mong muốn một số hình thức của mẫu chức năng phù hợp phải có được một danh sách các thư mục có liên quan, hoặc thư mục, và thực hiện các tên file thủ tục lựa chọn của riêng mình.

Điều đó nói rằng, nếu máy chủ của bạn hỗ trợ nó, bạn vẫn có thể sử dụng FtpWebRequest class, nhưng bạn sẽ phải xử lý các phản ứng chính mình để xử lý các danh sách các mục, như các lớp .NET sẽ không hiểu bạn mở rộng máy chủ cụ thể.

0

Đặc tả FTP cho biết đối số cho các lệnh liệt kê tệp (LIST, NLIST, MLSD, v.v.) là tên đường dẫn. Vì vậy, không nên có ký tự đại diện, bất cứ điều gì.

RFC 959 (LIST + NLIST):

2,2. NGỮ

...

pathname

tên đường dẫn được định nghĩa là các chuỗi ký tự mà phải đầu vào cho một hệ thống tập tin của người dùng để xác định một tập tin. tên đường dẫn thường chứa thiết bị và/hoặc tên thư mục, và tên file đặc điểm kỹ thuật. FTP chưa chỉ định quy ước tên đường dẫn tiêu chuẩn . Mỗi người sử dụng phải tuân theo các tập tin đặt tên ước của các hệ thống tập tin liên quan đến việc chuyển nhượng.

...

5.3.1.Các lệnh FTP

...

LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>

RFC 3659 (MLSD):

2.2.2. Ký tự đại diện

Đối với các lệnh được xác định trong đặc điểm kỹ thuật này, tất cả các tên đường dẫn là được xử lý theo nghĩa đen. Tức là, đối với một tên đường dẫn được đưa ra như một tham số cho một lệnh, tệp có tên giống với tên đường dẫn được cho là được ngụ ý. Không có ký tự nào trong tên đường dẫn có thể được coi là đặc biệt hoặc "ma thuật", do đó không khớp mẫu (khác với chính xác bình đẳng) giữa tên đường dẫn và các tệp có trong số NVFS của máy chủ-FTP.

...

7.1. Format của MLSx yêu cầu

...

Cú pháp cho lệnh MLSx là:

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

Trên thực tế mặc dù nhiều máy chủ FTP làm hỗ trợ wilcards trong đối số. Nhưng vì đặc điểm kỹ thuật không cho phép điều đó, rõ ràng là không có tiêu chuẩn đã đặt cho các ký tự đại diện được hỗ trợ.

vsftpd hỗ trợ *, ?{} với LIST. vsftpd không hỗ trợ MLSD hiện đại.

proftpd hỗ trợ *, ?[]. Nhưng chỉ cho LIST. Nó rõ ràng không cho phép các ký tự đại diện với MLSD hiện đại có nhận xét:

RFC3659 rõ ràng KHÔNG hỗ trợ ký tự glob. Vì vậy, hãy cảnh báo về điều này, nhưng hãy để lệnh tiếp tục như vậy.

PureFTPd hỗ trợ *, ?[] cho cả LISTMLSD.

FileZilla máy chủ hỗ trợ * chỉ cả LISTMLSD.


Nhưng nói chung, bạn không nên dựa vào máy chủ FTP để hỗ trợ bất kỳ ký tự đại diện nào.

Cách tiếp cận đáng tin cậy duy nhất là truy xuất danh sách thư mục đầy đủ và lọc các tệp cục bộ. Ví dụ: bạn có thể sử dụng cụm từ thông dụng (số Regex class)