def delete(names): '''Deletes names at the current path.''' qGui.put((ProgressAction.stop, )) remote = [] for name in names[0]: # directory remote.append(name) for name in names[1]: item = fs[name] item.initParts(name) remote += item.getNames(url) qGui.put((ProgressAction.max, len(remote))) for i, name in enumerate(remote): if not qBack.empty(): qBack.get() break base.delete(join(url, name)) qGui.put((ProgressAction.value, i)) qGui.put((ProgressAction.quit, ))
def download(path, names, deleteSource): ''' Downloads names to path. Deletes sources if required. :param path: str, destination path :param names: (list of str, list of str), (directories, files) to upload :param deleteSource: bool, if source is to be moved, so delete source after copying ''' localFs = {} # collecting items from subdirectories to upload for name in names[1]: # get local file sizes localFs[name] = fs[name] c = Collect(url, ls, names[0], localFs) qGui.put((ProgressAction.max, c.totalSize)) stop = None abort = None copied = 0 t = time() # starting time for speed measurement for item in c.items: # loop over content if 'name' in item: # copying a file name = item['name'] itemUrl = item['url'] dst = join(path, itemUrl, name) item = item['item'] index = 0 rest = item.size item.initParts(name) chunkSize = CHUNK_SIZE done = 0 if isfile(dst): # the file already exists, continuing stopped download done = getSize(dst) copied += done rest -= done while done > 0: # iterating on remote filenames until downloaded size index += 1 name = item.getPart(index) done -= item.getSize(index) if done < 0: # the download has been broken: continuing at the last byte index -= 1 name = item.getPart(index) done += item.getSize(index) # the reminder of the last part chunkSize = min(done, CHUNK_SIZE) # not to download more than the rest with open(dst, 'ab') as fp: # appending content to destination file while stop is None and rest > 0: # cancel stops downloading on part limit src = join(url, itemUrl, name) response = base.download(src) while abort != ProgressAction.abort: # stop stops downloading right now buf = response.read(chunkSize) if not buf: break currentLen = len(buf) if done > 0: # already downloaded done -= currentLen if done == 0: chunkSize = CHUNK_SIZE else: chunkSize = min(done, CHUNK_SIZE) # not to download more than the rest else: copied += currentLen rest -= currentLen fp.write(buf) if stop is None: stop = progress(copied) else: abort = progress(copied, rest) response.close() index += 1 name = item.getPart(index) if deleteSource: base.delete(src) else: # new directory mkDir(join(path, item['url'])) if stop is not None: break logSpeed(t, copied) qGui.put((ProgressAction.quit, ))