复制带有校验和的文件

Copy a file with checksum

我创建了一个函数,将文件从目录 A 复制到 B,并在删除 A 之前比较两个校验和。

现在我重新发明了轮子。 我想知道如何才能做得更好。而不是使用 shutilhashlib.

实现新的 safe_copy()

信息:

这个问题不是关于性能的(但这总是一个很好的提出点),而是关于一般的代码重用。

对于任何刚起步的程序员来说,深入研究您感兴趣的东西绝对是有意义的 - 如果您的情况是文件管理,那当然很好。请记住,Python 根本不是最终严重依赖性能的最佳语言。如果您热衷于学习 C++ 或 Rust 这样的语言,可能更有意义。

如果您确实想在 Python 中继续开发它,无论如何,您一定要通读标准模块 osshutilpathlibhashlib.您所描述的程序可以很简单:

from pathlib import Path
from shutil import copyfile
from hashlib import md5
from os import remove


def file_md5(fname):
    chunk_size = 16384  # arbitrary
    md5_hash = md5()
    with open(fname, 'rb') as f:
        for chunk in iter(lambda: f.read(chunk_size), b''):
            md5_hash.update(chunk)
    return md5_hash.hexdigest()


a = 'C:\temp\a.txt'
b = 'C:\temp\b.txt'
if Path(b).is_file():
    print('that file already exists!')
    exit(1)
else:
    copyfile(a, b)

if file_md5(a) != file_md5(b):
    print('something is not the same')
else:
    remove(a)

(如果您有实际的 C:\temp\a.txt 文件,显然不要只 运行 这个脚本)

存在数以千计的文件管理实用程序,这些实用程序已经开发了几十年,并且针对速度或非常具体的功能进行了高度优化。在几乎任何现实世界的项目中,combine/package 几个这样的项目并使用批处理语言(或者可能 Python)将它们编写在一起比从头开始重写它们更有意义。

重写对于更多地了解它们的内部工作原理是有意义的,但是一旦您理解了它们,您可能会发现自己放弃了这项工作。重写的另一个原因可能是因为您对如何做得更好有一个聪明的想法,但这几乎可以保证其他语言的表现优于 Python.

后续评论:据我所知,Windows 中没有一个实用程序可以一次性完成 'safe-copy'。我认为这主要是因为如果出现问题,您几乎可以依赖 robocopy(标准 Windows)等实用程序来失败,并且如果没有错误地完成,请放心您的副本是好的。

但是,我可以理解想要更加确定,因此将 robocopy 之类的内容与 PowerShell 中的 Get-FileHash 之类的 cmdlet 串在一起会相当简单。 PowerShell 也是 Windows 的标准部分,编写 .ps1 脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较 filehas 并根据结果删除适当的文件”-PowerShell 脚本只有几行,无需安装。