Advertisement
ellethee

copy_file per threads

Oct 4th, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.48 KB | None | 0 0
  1. def copy_file(
  2.         source, destination, queue, overwrite=True,
  3.         progress_factory=fake_factory, progress_deleter=none_function,
  4.         total_inc=none_function, ask_dialog=none_function,
  5.         block_size=BLOCK_SIZE):
  6.     """
  7.    Copia un file.
  8.  
  9.    In realtà la parte **teorica** è effettivamente teorica.
  10.    E' quello che a grandi linee mi aspetterei che funzionasse concettaulmente.
  11.    A livello di codice stavo simulando la cosa con uno scriptino di test che
  12.    è ancora sotto i ferri. Ma questo è quello che vorrei facesse la funzione
  13.    originale.
  14.    """
  15.     size = getsize(source)
  16.     progress = progress_factory(basename(source), size, widgets=[EpStatus])
  17.     if isdir(destination):
  18.         destination = join(destination, basename(source))
  19.     # Inizio gestione **teorica** dei thread.
  20.     # Recupero quello che potrebbe essere un oggetto con le info che mi servono
  21.     qobj = queue.get()
  22.     event = qobj.event
  23.     # Facciamo aspettare in base all'evento, se ho ben capito una volta che
  24.     # ho fatto il set dovrebbe dovrebbe entrare in loop fino al clear.
  25.     # e mi aspetto che se non c'è stato un set non attenda al wait()
  26.     event.wait()
  27.     # Dopo il wait recuperiamo ancora l'oggetto che potrebbe essere stato
  28.     # modificato.
  29.     qobj = queue.get()
  30.     # qobj.overwrite dovrebbe essere a None se non è stato utilizzato altrove.
  31.     if qobj.overwrite is not None:
  32.         overwrite = qobj.overwrite
  33.     # Se la modalità di overwrite è Ask e il file esiste.
  34.     if overwrite is Ask and os.path.exists(destination) is True:
  35.         # imposto il flag sull'evento.
  36.         event.set()
  37.         # Recupero la risposta dell'overwrite dal dialoglo.
  38.         overwrite = ask_dialog("Sovrascrivere il file %s")
  39.         # Imposto l'overwrite nel qobject.
  40.         qobj.overwrite = overwrite
  41.         # Rimtto in coda.
  42.         queue.put(qobj)
  43.         # Pulisco il flag dell'evento.
  44.         event.clear()
  45.     # Fine gestione **teorica** dei thread.
  46.     with open(source, 'rb') as src:
  47.         if os.path.exists(destination) is False or overwrite is True:
  48.             with open(destination, 'wb') as dest:
  49.                 while True:
  50.                     data = src.read(block_size)
  51.                     if not data:
  52.                         break
  53.                     dest.write(data)
  54.                     progress.update(dest.tell())
  55.         else:
  56.             progress.set_exists()
  57.             progress.fill()
  58.     total_inc()
  59.     progress_deleter(progress)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement