对于任何初级程序员来说,深入研究你感兴趣的东西绝对是有意义的——如果,在你的情况下,那是文件管理,那当然没问题。请记住,对于最终严重依赖性能的东西来说,Python 根本不是一种最佳语言。如果您有兴趣,学习 C++ 或 Rust 之类的语言可能更有意义。
如果您确实想继续使用 Python 进行开发,您绝对应该通读标准模块 os、shutil、pathlib 和 hashlib。您描述的程序可能很简单:
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 文件,不要只运行这个脚本,显然)
已有数千个文件管理实用程序已经开发了数十年,并且针对速度或非常特定的功能进行了高度优化。在几乎所有现实世界的项目中,将其中的几个组合/打包并使用批处理语言(或者可能是 Python)编写脚本比从头开始重写它们更有意义。
重写可以更深入地了解它们的内部工作原理,但一旦了解它们,您可能会发现自己放弃了工作。重写的另一个原因可能是因为您对如何做得更好有一个聪明的想法,但这是几乎可以保证其他语言胜过 Python 的地方。
后续评论:据我所知,Windows 中没有一个实用程序可以一次性完成“安全复制”。我认为这主要是因为您几乎可以依靠 robocopy(标准 Windows)之类的实用程序在出现问题时失败,并确保您的副本在没有错误的情况下完成。
但是,我希望能够更加确定,因此将 robocopy 之类的内容与来自 PowerShell 的 Get-FileHash 之类的 cmdlet 一起串起来相当简单。 PowerShell 也是 Windows 的标准部分,编写 .ps1 脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较文件,并根据结果删除适当的文件”-PowerShell 脚本只需几行,无需安装。