Question

Comme la plupart, il me faut un certain temps pour m'habituer à l'utilisation des Deferreds, mais j'y arrive lentement.Cependant, je ne comprends pas comment traiter une réponse, puis appeler une autre commande FTP. en utilisant la réponse traitée lors de l'utilisation du module FTP de Twisted.J'utilise le exemple de code FTP comme point de départ.

Je souhaite me connecter à un serveur FTP, obtenir tous les répertoires de niveau supérieur, puis saisir chacun d'eux et télécharger tous les fichiers.

Je connecte d'abord :

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()

Il se connecte avec succès, donc mon connectionMade la fonction est appelée :

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)

Comme vous le voyez, je fais la queue getSortedDirectories et puis 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

Ma question est la suivante : comment puis-je parcourir les répertoires dans enterDirs?

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

Dois-je passer ftpClient à enterDirs comme fileList est transmis à getSortedDirectories et ensuite faire mes demandes de téléchargement ?

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)

Est-ce la meilleure approche ?

Était-ce utile?

La solution

Dois-je passer FTPClient à des enterdirs comme FileList est transmis à GetSortedDirectries et ensuite faire mes demandes de téléchargement?...Est-ce la meilleure approche?

Je pense que passer explicitement l'objet client comme argument est en effet la meilleure approche - surtout, c'est sobre et élégant.La principale alternative serait de coder une classe et de ranger l'objet client dans une variable d'instance, ce qui semble un peu plus fastidieux ;utiliser une variable globale à cet effet serait, à mon avis, l'alternative la moins souhaitable (moins il y a de variables globales, mieux c'est !-).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top