Безопасная копия файла Python-программы - что за проблема в коде - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь скопировать файлы из одного места назначения в другое, и я следую этой программе, и я не знаю, что я сделал ошибку, но файлы не копируются в папку назначения.https://gist.github.com/alexwlchan/c2adbb8ee782f460e5ec

Я не слишком много знаю о программировании, я просто следую учебному пособию.

Я добавил дополнительно в этот код

src = ("F:\\Work\\")
dst = ("F:\\ws\\")

Поэтому, пожалуйста, поправьте меняесли я не прав.

Заранее спасибо!

import filecmp
import os
import shutil

src = ("F:\\Work\\")
dst = ("F:\\ws\\")

def _increment_filename(filename, marker='-'):
    basename, fileext = os.path.splitext(filename)
    if marker not in basename:
        base = basename
        value = 0
    else:
        base, counter = basename.rsplit(marker, 1)
        try:
            value = int(counter)
        except ValueError:
            base = basename
            value = 0
    while True:
        if value == 0:
            value += 1
            yield filename
        value += 1
        yield '%s%s%d%s' % (base, marker, value, fileext)

def copyfile(src, dst):
    if not os.path.exists(src):
        raise ValueError('Source file does not exist: {}'.format(src))

    if not os.path.exists(os.path.dirname(dst)):
        os.makedirs(os.path.dirname(dst))

    while True:

        dst_gen = _increment_filename(dst)
        dst = next(dst_gen)

        if os.path.exists(dst):

            if filecmp.cmp(src, dst):
                return dst
            else:

                try:
                    src_fd = os.open(src, os.O_RDONLY)
                    dst_fd = os.open(dst, os.O_WRONLY|os.O_EXCL|os.O_CREAT|os.O_EXLOCK)

                # Read 100 bytes at a time, and copy them from src to dst
                    while True:
                        data = os.read(src_fd, 100)
                        os.write(dst_fd, data)

                    # When there are no more bytes to read from the source
                    # file, 'data' will be an empty string
                        if not data:
                            break

                # If we get to this point, then the write has succeeded
                    return dst

                except OSError as e:
                    if e.errno != 17 or e.strerror != 'File exists':
                        raise
                    else:
                        print('Race condition: %s just popped into existence' % dst)

                finally:
                    os.close(src_fd)
                    os.close(dst_fd)

        # Copying to this destination path has been unsuccessful, so increment
        # the path and try again
            dst = next(dst_gen)

def move(src, dst):
    dst = copyfile(src, dst)
    os.remove(src)
    return dst

В программе нет ошибок, программа работает нормально, но папка назначения пуста.

Ожидаемым результатом должно быть копирование файлов в целевую папку и ниже ожидаемого результата в соответствии с программой

Если файл уже существует в dst, он не будет перезаписан, но:

 * If it is the same as the source file, do nothing
 * If it is different to the source file, pick a new name for the copy that
   is distinct and unused, then copy the file there.

1 Ответ

0 голосов
/ 12 февраля 2019

Извините, но этот код кажется слишком сложным.это должно работать почти во всех случаях.Если dst уже существует, он будет добавлять подчеркивания (_) к имени каталога, пока не будет найден неиспользуемый:

import os
import shutil
import filecmp

src = ("D:\\Documents\\oof")
dst = ("D:\\oof")
validextensions = ["jpeg", "txt", "pdf", "pptx"]


def copydir(src, dst):
    if not os.path.isdir(src):
        print("Source directory doesn't exist.")
        return None
    if not os.path.exists(dst):
        os.mkdir(dst)
    elif not os.path.isdir(dst):
        while not os.path.isdir(dst):
            dst += "_"
        os.mkdir(dst)

    for file in os.listdir(src):
        frompath = os.path.join(src, file)
        topath = os.path.join(dst, file)
        if os.path.isfile(frompath):
            complete = False
            if not any([file[-1 * len(ext):] == ext for ext in validextensions]):
                complete = True
            while not complete:
                if os.path.isfile(topath):
                    if filecmp.cmp(frompath, topath):
                        complete = True
                    else:
                        topath = topath[:topath.index(".")] + "_" + topath[topath.index("."):]
                else:
                    shutil.copyfile(frompath, topath)
                    complete = True
        elif os.path.isdir(frompath):
            copydir(frompath, topath)


copydir(src, dst)

Мне нравится, как это постепенно усложняется, так какОП перечисляет больше функций, которые они хотели facepalm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...