[PIPython] Ftp

Simone Piunno pioppo
Ven 19 Nov 2004 15:16:44 CET


On Friday 19 March 2004 17:32, Gianluca Di Carlo wrote:

> Salve,
> utilizzando ftplib o wxFTP è possibile conoscere in ogni momento la
> quantità di byte già inviati? Vorrei realizzare una barra di
> progressione legata all'upload di file via ftp.

Use the source, Luke...
Non si chiama Open Source per niente.

    def storbinary(self, cmd, fp, blocksize=8192):
        '''Store a file in binary mode.'''
        self.voidcmd('TYPE I')
        conn = self.transfercmd(cmd)
        while 1:
            buf = fp.read(blocksize)
            if not buf: break
            conn.sendall(buf)
        conn.close()
        return self.voidresp()

Questo è il metodo che invochi per fare l'upload, lo trovi nel file ftplib.py 
della libreria standard di python.  
Normalmente gli passi un file aperto in fp... o meglio... gli passi un oggetto 
dotato del metodo .read()... 
Il metodo viene invocato per blocchi, ecco quindi come fare la barra di 
progressione usando il pattern Observer (supponendo che fp sia seekable oltre 
che readable):

class ProgBar:
  def __init__(self):
    self.size = 0
    self.current = 0
  def update_display(self):
    # qui ridisegna la barra di progressione
	
class FileWithProgBarObserver:
  "si comporta come un file che può essere letto"
  def __init__(self, fp, bar=None):
     self._fp = fp
     self._bar = bar
     fp.seek(0, 2)
     bar.size = fp.tell()
     fp.seek(0, 0)
  def read(self, blocksize):
     self._bar = fp.tell()
     self._bar.update_display()
     return self.__fp(blocksize)

dopodichè, invece di

fp = open('pippo')
ftp.storbinary('STOR pippo', fp)
fp.close()

puoi fare:

fp = FileWithProgBarObserver(file('pippo'), ProgBar())
ftp.storbinary('STOR pippo', fp)
fp.close()

e la barra di progressione sarà aggiornata e ridisegnata ad ogni blocco da 8 
kappa.

-- 
http://thisurlenablesemailtogetthroughoverzealousspamfilters.org




More information about the Python mailing list