def upload(path, names, deleteSource): ''' Uploads path + names to current directory. Deletes sources if required. :param path: str, source 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] = SizedFile(getSize(join(path, name))) c = Collect(path, fileLs, names[0], localFs) qGui.put((ProgressAction.max, c.totalSize)) copied = 0 stop = None 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'] src = join(path, itemUrl, name) item = item['item'] rest = item.size baseName = name fp = open(src, 'rb') # opening local file for reading index = 0 while rest > 0: # loop for uploading parts up to size of upload limit dst = join(url, itemUrl, name) currentLen, stop = base.upload(dst, fp, min(rest, UPLOAD_LIMIT), copied, progress) if stop is not None: # the user may pressed cancel break name = '{}.v{:02d}'.format(baseName, index) # new part's name will be <filename>.v\d\d copied += currentLen rest -= currentLen index += 1 fp.close() if deleteSource: # deleting local file if the action was a move deleteFile(src) else: # new directory base.mkDir(join(url, item['url'])) if stop is not None: break logSpeed(t, copied) 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, ))