문제

대부분은 연기를 사용하는 데 익숙해 지지만 천천히 거기에 도착하는 것입니다. 그러나 Twisted의 FTP 모듈을 사용할 때 응답을 처리 한 다음 다른 FTP 명령 다른 FTP 명령 을 어떻게 호출 할 수있는 방법은 분명하지 않습니다. 예제 FTP 코드 예제 예제 .

FTP 서버에 연결하고 최상위 레벨 디렉터리를 모두 가져 와서 각 파일을 입력하고 모든 파일을 다운로드하십시오.

첫 번째 연결 :

creator = ClientCreator(reactor, FTPClient, config.opts['username'], config.opts['password'], passive=config.opts['passive'])
creator.connectTCP(config.opts['host'], config.opts['port']).addCallback(connectionMade).addErrback(connectionFailed)
reactor.run()
.

성공적으로 연결되므로 connectionMade 함수가 호출됩니다.

def connectionMade(ftpClient):
    # Get a detailed listing of the current directory
    fileList = FTPFileListProtocol()
    d = ftpClient.list('.', fileList)
    d.addCallbacks(getSortedDirectories, fail, callbackArgs=(fileList,))
    d.addCallback(enterDirs)
.

보시다시피, i getSortedDirectories를 대기열로 큐를 탐색 한 다음 enterDirs입니다.

def getSortedDirectories(result, fileListProtocol):
    # Go through all directories from greatest to least
    dirs = [directory for directory in sorted(fileListProtocol.files, reverse=True) if directory['filetype'] == 'd']
    return dirs
.

내 질문은 enterDirs에서 디렉토리를 어떻게 통과합니까?

def enterDirs(dirs):
    for directory in dirs:
        print "We'd be entering '%s' now." % directory
.

ftpClient와 같은 enterDirsfileList에 전달되어 getSortedDirectories로 전달 된 다음 내 다운로드 요청을 만드십시오

d.addCallback(enterDirs, callbackArgs=(ftpClient,))

def enterDirs(dirs, ftpClient):
    for directory in dirs:
        fileList = FTPFileListProtocol()
        d = ftpClient.list(directory, fileList)
        d.addCallbacks(downloadFiles, fail, callbackArgs=(directory, fileList, ftpClient))

def downloadFiles(result, directory, fileListProtocol, ftpClient):
    for f in fileListProtocol.files if f.filetype == '-':
        fileConsumer = FileConsumer()
        ftpClient.retrieveFile(os.path.join(directory['filename'], file['filename']), fileConsumer)
.

이게 가장 좋은 방법입니까?

도움이 되었습니까?

해결책

ftpclient를 통과해야합니다 Filelist와 같은 EnterDir은 전달됩니다 GetSortedDirectories 및 My. 다운로드 요청?...이게 다 가장 좋은 방법?

나는 인수로서의 클라이언트 객체를 명시 적으로 전달하는 것이 실제로 최상의 접근 방식이다 - 대부분은 여분의 우아하고 우아하다고 생각한다.주요 대안은 클래스를 코딩하고 클라이언트 객체를 인스턴스 변수로 숨기고 조금 더 번거롭게 보이는 것으로 보입니다.목적을 위해 글로벌 변수를 사용하려면, 제 의견으로는 가장 바람직한 대안이 될 것입니다 (주변의 글로벌이 더 적은 것! -).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top