質問

ほとんどのように、遅延を使うのに慣れるために私を連れて行きますが、私はゆっくりそこに着くです。ただし、Twistedの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)
.

表示されているように、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のようなEnterdirsが渡されます getSortedDirectoriesとそれからmyを作ります リクエストをダウンロードしますか?...これは 最良のアプローチ?

私は、クライアントオブジェクトを引数として明示的に渡すことは確かに最高のアプローチです - 大部分は予備的でエレガントです。主な代替手段は、クラスをコーディングしてクライアントオブジェクトをインスタンス変数に隠すことです。これはもう少し面倒なようです。目的のためにグローバルな変数を使用することは、私の意見では、最も望ましい代替案(周りより少ない世界的な、より多くの世界的なものです! - )。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top