复制文件,但不要覆盖,在 Python 中没有 TOCTTOU 问题

Copy a file, but don't overwrite, without TOCTTOU issues in Python

我知道如果我想在 Python 中复制一个文件但不覆盖目的地,我可以使用这样的代码:

if os.path.exists(dest):
    raise Exception("Destination file exists!")
else:
    shutil.copy2(src, dest)

但是在我调用 os.path.exists 和调用 copy2 之间,世界的状态可能会发生变化。是否有更优选的方式来复制而不覆盖,假设如果目标已经存在,复制操作将引发异常?

您可以使用下级os.open and then os.fdopen复制文件:

import os
import shutil

# Open the file and raise an exception if it exists
fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)

# Copy the file and automatically close files at the end
with os.fdopen(fd) as f:
    with open(src_filename) as sf:
        shutil.copyfileobj(sf, f)