复制文件,但不要覆盖,在 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)
我知道如果我想在 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)