等到文件复制/上传完成

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 秒在任何网络上都应该绰绰有余

【讨论】:

以上是关于等到文件复制/上传完成的主要内容,如果未能解决你的问题,请参考以下文章

xshell用啥上传文件

等到 Symantec End Point DoScan.exe 完成文件扫描

esxi 6 虚拟机安装复制

使用 gsutil 复制文件后,它们不会立即从本地存储中删除

github如何上传和拉取文件??(windows篇)

在项目中复制一个cshtml文件 ,改名字,上传后无法浏览