Пример #1
0
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, ))
Пример #2
0
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, ))