等到文件复制/上传完成
Posted
技术标签:
【中文标题】等到文件复制/上传完成【英文标题】:Wait till file gets copy/upload completes 【发布时间】:2021-06-24 11:07:58 【问题描述】:我必须等到文件复制/上传完全使用 python 完成(首选方法),bash/shell 也可以(我将从 python 调用)
我已经共享 nfs 目录 /data/files_in/,如果有人将文件复制/上传到 /data/files_in/ 目录,我应该通知其他应用程序,只有在完成文件复制/上传完成后
我当前检查文件的代码是否已完成复制
while True:
current_size = Path(file_path).stat().st_size
time.sleep(5)
result_size = Path(file_path).stat().st_size
if result_size == current_size:
break
# Notify your application
它只适用于小文件,对于像 100G 文件这样的大文件,它不能正常工作。
我增加了一个计时器,但有时它仍然会失败,并且基于计时器的方法似乎不是一个值得依赖的好主意。
有没有其他方法,我可以实现代码来解决这个问题?
操作系统:Linux、Cent 操作系统 Python 版本:3.9
【问题讨论】:
无法正常工作:这是什么意思? 文件复制前的意思是从while循环出来 您永远不会检查复制是否完成。您只需检查文件大小在过去 5 秒内是否未更改。 是的,目前我正在使用文件大小作为逻辑,检查是否完成,如果没有更改,则文件复制完成。 我认为没有一种万无一失的方法可以确定复制是否完成,除非您以某种方式与创建该文件的进程本身进行通信。因此,您想到的每个启发式方法都可能偶尔中断。 【参考方案1】:我无法发表评论,所以我会在这里问。结果大小不应该比当前大小更大(或至少不同)以完成文件上传并因此停止循环吗?
【讨论】:
我假设,如果当前和结果大小没有改变,它已经完成,因为我正在检查相同的文件路径【参考方案2】:我假设您无法与其他进程(即复制/上传文件的进程)建立任何类型的直接通信。
在这些情况下,一种常见的方法是让其他进程写入/擦除“信号量”文件。可能是它在开始复制之前创建信号量并在完成后将其擦除,所以信号量的意思是“不要做任何事情,我还在运行”,或者反过来,它在完成后创建信号量并在下次开始之前将其擦除,因此信号量表示“您的数据已准备好使用”。
也就是说,如果你有足够的时间,我很惊讶你的方法不起作用,而且 5 秒在任何网络上都应该绰绰有余
【讨论】:
以上是关于等到文件复制/上传完成的主要内容,如果未能解决你的问题,请参考以下文章
等到 Symantec End Point DoScan.exe 完成文件扫描