【问题标题】: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 秒内是否未更改。
  • 是的,目前我正在使用文件大小作为逻辑,检查是否完成,如果没有更改,则文件复制完成。
  • 我认为没有一种万无一失的方法可以确定复制是否完成,除非您以某种方式与创建该文件的进程本身进行通信。因此,您想到的每个启发式方法都可能偶尔中断。

标签: python python-3.x linux shell nfs


【解决方案1】:

我无法发表评论,所以我会在这里问。结果大小不应该比当前大小更大(或至少不同)以完成文件上传并因此停止循环吗?

【讨论】:

  • 我假设,如果当前和结果大小没有改变,它已经完成,因为我正在检查相同的文件路径
【解决方案2】:

我假设您无法与其他进程(即复制/上传文件的进程)建立任何类型的直接通信。

在这些情况下,一种常见的方法是让其他进程写入/擦除“信号量”文件。可能是它在开始复制之前创建信号量并在完成后将其擦除,所以信号量的意思是“不要做任何事情,我还在运行”,或者反过来,它在完成后创建信号量并在下次开始之前将其擦除,因此信号量表示“您的数据已准备好使用”。

也就是说,如果你有足够的时间,我很惊讶你的方法不起作用,而且 5 秒在任何网络上都应该绰绰有余

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2020-06-02
    • 2020-04-08
    • 1970-01-01
    • 2018-04-08
    • 2020-02-12
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多