Код: Выделить всё
shutil.copy
Код: Выделить всё
shutil.copy2
- (а также Shutil.copyfileobj)
Код: Выделить всё
shutil.copyfile
- или даже наивный метод:
Код: Выделить всё
with open('sourcefile', 'rb') as f, open('destfile', 'wb') as g: while True: block = f.read(16*1024*1024) # work by blocks of 16 MB if not block: # EOF break g.write(block)
Под безопасным я имею в виду: если копия файла размером 1 ГБ не завершена на 100 % (скажем, она прервана в середине копирования, после 400 МБ) ), размер файла не должен сообщаться как 1 ГБ в файловой системе, он должен:
- либо сообщать размер файла когда последние байты были записаны (например, 400 МБ)
- или будут удалены
Многие программы инкрементального резервного копирования (я пишу одну) используйте «имя_файла+mtime+fsize», чтобы проверить, нужно ли копировать файл или он уже существует (конечно, лучшим решением является использование исходных и целевых файлов SHA256, но это не делается для каждой синхронизации, это отнимает слишком много времени; здесь не по теме).
Поэтому я хочу убедиться, что функция «копировать файл» не сохраняет сразу окончательный размер файла (тогда она может обмануть сравнение fsize ), прежде чем копировать фактическое содержимое файла.
Примечание. Я задаю этот вопрос, потому что, хотя Shutil.filecopy был довольно простым Python 3.7 и ниже, см. исходный код (это более или менее наивный метод, описанный выше), на Python 3.9 он кажется гораздо более сложным, см. исходный код, со множеством различных случаев для Windows, Linux, MacOS, приемов «быстрого копирования» и т. д. < /п>
Подробнее здесь: https://stackoverflow.com/questions/652 ... copy-is-in