我正在编写一个python脚本,在Linux上使用shutil.copyfile()复制文件。在复制过程中,其他进程可能正在尝试读取该文件。以下内容是否足以确保外部进程不会损坏文件?
os.unlink(dest)
shutil.copyfile(src, dest)
也就是说,是shutil.copyfile()原子,以便其他进程在复制操作完成之前无法读取目标文件?
答案 0 :(得分:5)
不,似乎只是loop, reading and writing 16KB at a time。
对于原子复制操作,您应该将文件复制到同一文件系统上的不同位置,然后os.rename()
将其复制到所需位置( 保证是原子的的Linux)。
答案 1 :(得分:3)
不,shutil.copyfile
不是原子的。这是definition of shutil.copyfile
:
def copyfile(src, dst, *, follow_symlinks=True):
...
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)
其中copyfileobj
is defined like this:
def copyfileobj(fsrc, fdst, length=16*1024):
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
调用copyfile
的线程可以在此while-loop
内停止,此时某些其他进程可能会尝试打开要读取的文件。它会得到一个损坏的文件视图。