Domanda

Come la maggior parte dei casi, mi ci vuole un po' per abituarmi all'uso dei differiti, ma ci sto lentamente arrivando.Tuttavia, non mi è chiaro come posso elaborare una risposta e quindi richiamare un altro comando FTP utilizzando la risposta elaborata quando si utilizza il modulo FTP di Twisted.Sto usando il codice FTP di esempio come punto di partenza.

Voglio connettermi a un server FTP, ottenere tutte le directory di livello superiore, quindi inserirle in ciascuna e scaricare tutti i file.

Per prima cosa mi collego:

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

Si connette correttamente, quindi my connectionMade la funzione viene chiamata:

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)

Come vedi, faccio la fila getSortedDirectories poi 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

La mia domanda è: come posso scorrere le directory in enterDirs?

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

Dovrei passare ftpClient A enterDirs Piace fileList viene passato a getSortedDirectories e poi effettuare le mie richieste di download?

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)

È questo l'approccio migliore?

È stato utile?

Soluzione

Dovrei passare FtpClient a Enterdirs come Filelist è passato a getSortedDirectories e quindi fare le mie richieste di download?...È questo l'approccio migliore?

Penso che passare esplicitamente l'oggetto client come argomento sia davvero l'approccio migliore: soprattutto, è sobrio ed elegante.L'alternativa principale sarebbe codificare una classe e nascondere l'oggetto client in una variabile di istanza, il che sembra un po' più complicato;utilizzare una variabile globale per lo scopo sarebbe, a mio avviso, l'alternativa meno desiderabile (meno variabili globali in giro, meglio è!-).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top