2012-02-14 3 views
5

먼저 내가 묻는 질문은 ftp directory listing timeout. Huge number of subdirs입니다. 나는 대답을 얻었다.와일드 카드가있는 FTP 디렉토리의 부분 목록

여전히 디렉토리에 수십만 개의 FTP 객체가있을 수 있으므로 실제로 스캔하는 데 오랜 시간이 걸릴 수 있습니다. 그러나 'A'로 시작하고 'B'등으로 시작하는 모든 개체를 검색하는 것이 가능할 수도 있다고 생각했습니다. 디렉터리를 검색 할 때 전체 목록을 가져올 때까지 기다리지 않고 다른 스레드에서 처리하기 시작할 수 있습니다. .

표준 FtpWebRequest을 사용하여 와일드 카드로 FTP 디렉토리 목록을 만들 수 있습니까?

답변

6

FTP specification (RFC 3659)의 최신 업데이트가 명시 적으로 금지되어 있습니다. section 2.2.2 of that specification, titled "Wildcarding" (강조 광산)에서이 규격에 정의 된 명령에 대한

, 모든 경로 이름은 문자 그대로 처리 할 수 ​​ 에 있습니다. 즉, 에 대한 매개 변수로 주어진 경로 이름에 대해 주어진 경로 이름과 동일한 이름의 파일은 이 암시합니다. 경로명의 어떤 문자도 특수한 것으로 취급되거나 "magic"으로 취급 될 수 없으므로 주어진 경로 이름과 server-FTP의 NVFS에있는 파일 사이에 일치하는 패턴 (정확히 일치하지 않음)이 사이에 허용됩니다. 패턴 매칭 기능의 형태를 원하는

클라이언트는 관련 디렉토리 또는 디렉토리의 목록을 획득, 자신의 파일 이름 선택 절차를 구현해야합니다. 서버가 지원하는 경우 .NET 클래스를 이해하지 않으므로, 여전히 FtpWebRequest class을 사용할 수 있지만 자신이 항목의 목록을 처리 할 수있는 응답을 처리해야 할 것 말했다

당신의 서버 별 확장.

0

FTP 사양에 따르면 파일 목록 명령 (LIST, NLIST, MLSD 등)에 대한 인수는 경로 이름입니다. 따라서 와일드 카드가 없어야합니다.

RFC 959 (+ NLISTLIST)

2.2.

pathname

경로 이름이 정의 된 용어

는 ... 파일을 식별하기 위해 사용자가 파일 시스템에 입력해야합니다 문자열이 될 수 있습니다. 경로 이름에는 일반적으로 장치 및/또는 디렉토리 이름이 포함되고 파일 이름 지정은 입니다. FTP는 아직 표준 경로 이름 규칙을 지정하지 않습니다. 각 사용자는 전송에 관련된 파일 시스템 규칙 의 이름을 따라야합니다.

...

5.3.1.

2.2.2 : FTP는 ... NLST [<SP> <pathname>] <CRLF>

RFC 3659 (MLSD)

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

명령. 와일드 카드 문자

이 사양에 정의 된 명령의 경우 모든 경로 이름은 으로 처리됩니다. 즉, 명령에 대해 매개 변수로 제공된 경로 이름의 경우, 주어진 경로 이름과 동일한 이름의 파일이 이됩니다. 경로명의 어떤 문자도 special 또는 "magic"으로 취급 될 수 없으므로 주어진 경로 이름과 server-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 문자를 지원하지 않습니다. 따라서 에 대해 경고하지만 명령을 그대로 두십시오.

pureftpdLISTMLSD 모두 *, ?[]을 지원한다.

FileZilla의 서버*에만 모두 LISTMLSD을 지원합니다.


일반적으로 와일드 카드를 지원하기 위해 FTP 서버에 의존해서는 안됩니다.

신뢰할 수있는 유일한 방법은 전체 디렉터리 목록을 검색하고 파일을 로컬로 필터링하는 것입니다. 예를 들어 정규식 (Regex class)을 사용할 수 있습니다.

관련 문제